- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须明智地将矩阵条目与数字进行比较,因此我尝试定义一个 Cxx 函数,例如
src <- '
LogicalMatrix f(NumericMatrix fmat, double t){
LogicalMatrix result = fmat >= t;
return result;
}
'
cppFunction(src)
但是会抛出一些异常。是什么原因?那么我怎样才能整齐地做到这一点呢?
最佳答案
@duckmayr 的回答非常准确,并且显示了一个重要的细节:我们最好将实现细节隐藏在一个函数后面,因为毕竟这就是Rcpp Sugar 等人无论如何都为我们做。
但是如果我们首先将矩阵转换为向量,对该向量进行操作,然后恢复矩阵,我们就可以按照@zengchao 的要求依赖 Sugar 操作。这是可行的,因为在内部矩阵只是一个增加了维度的向量(二阶;数组一般化为多于两个)。
但事实证明......该版本比循环(略)昂贵(并且比在列上工作略便宜)。请参阅下面的完整详细信息,但函数 f3()
可能是:
// [[Rcpp::export]]
LogicalMatrix f3(NumericMatrix fmat, double t) {
IntegerVector dims = fmat.attr("dim");
NumericVector v(fmat);
LogicalVector lv = v >= t;
return LogicalMatrix(dims[0], dims[1], lv.begin());
}
但非显而易见的元素 f2()
仍然是最快的:
R> microbenchmark(f(mat, 1.0), f2(mat, 1.0), f3(mat, 1.0), times = 5e4)
Unit: nanoseconds
expr min lq mean median uq max neval
f(mat, 1) 873 992 1322.10 1042 1118.0 1493236 50000
f2(mat, 1) 823 925 1195.49 975 1049.5 2068214 50000
f3(mat, 1) 864 977 1288.68 1031 1114.0 1909361 50000
R>
道德:简单的循环解决方案对临时对象的复制最少,而且速度最快。总的来说,三者之间的速度差异无关紧要。
对于更大的矩阵,不复制临时对象的优势变得更加重要:
R> mat <- matrix(sqrt(1:1000), 1000)
R> microbenchmark(f(mat, 1.0), f2(mat, 1.0), f3(mat, 1.0), times = 1e3)
Unit: microseconds
expr min lq mean median uq max neval
f(mat, 1) 3.720 3.895 3.99972 3.9555 4.0425 16.758 1000
f2(mat, 1) 1.999 2.122 2.23261 2.1760 2.2545 17.325 1000
f3(mat, 1) 3.921 4.156 4.31034 4.2220 4.3270 19.982 1000
R>
完整代码如下。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
LogicalMatrix f(NumericMatrix fmat, double t){
int n = fmat.nrow(), m = fmat.ncol();
LogicalMatrix result(n, m);
for ( int j = 0; j < m; ++j ) {
result(_, j) = fmat(_, j) >= t;
}
return result;
}
// [[Rcpp::export]]
LogicalMatrix f2(NumericMatrix fmat, double t){
int n = fmat.nrow(), m = fmat.ncol();
LogicalMatrix result(n, m);
for ( int i = 0; i < n; ++i ) {
for ( int j = 0; j < m; ++j ) {
result(i, j) = fmat(i, j) >= t;
}
}
return result;
}
// [[Rcpp::export]]
LogicalMatrix f3(NumericMatrix fmat, double t) {
int dims[2] = { fmat.nrow(), fmat.ncol() };
NumericVector v(fmat);
LogicalVector lv = v >= t;
return LogicalMatrix(dims[0], dims[1], lv.begin());
}
/*** R
mat <- matrix(c(1,2,3,4), 2, 2)
library(microbenchmark)
microbenchmark(f(mat, 1.0), f2(mat, 1.0), f3(mat, 1.0), times = 1e5)
mat <- matrix(sqrt(1:1000), 1000)
microbenchmark(f(mat, 1.0), f2(mat, 1.0), f3(mat, 1.0), times = 1e3)
*/
编辑:我们可以再删除与 f3()
相关的一行,但这对运行时影响不大:
// [[Rcpp::export]]
LogicalMatrix f4(NumericMatrix fmat, double t) {
IntegerVector dims = fmat.attr("dim");
LogicalVector lv = NumericVector(fmat) >= t;
return LogicalMatrix(dims[0], dims[1], lv.begin());
}
关于r - 如何使用 "sugar"方式对 Rcpp::NumericMatrix 进行逻辑运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49026407/
我想在我的表 AnotherTable 中添加一个新列 anotherValue。 我已阅读 this related question和 SugarORM 文档,但是当我保存新数据并想稍后获取 an
我是一名 iOS 游戏开发者,最近看到一款有趣的物理和绘画游戏“Sugar, Sugar”。在游戏中,有许多像素粒子(数千个)从屏幕上生成并自由落到地上。玩家可以绘制任何形状的线条,这些线条可以将这些
private class HSV extends HorizontalScrollView { public LinearLayout L; public AbsoluteLayou
我将 Sugar ORM 用于数据库,将 Robolectric 用于单元测试。要将 Sugar ORM 与 Robolectric 结合使用,我遵循了 this问题。 我将下面的代码放入 start
当任何用户删除记录时,还需要将电子邮件发送给特定用户和管理员用户。我正在使用 Sugar CRM Pro,我也尝试过工作流程,但没有删除模块的操作。 最佳答案 您可以使用after_delete逻辑钩
我有这个lngArr: [ { "data": { "18746": 20.75, "id": "18746",
为了说明我的观点,以下代码包含一个名为ColorValueChanger的方法,该方法使用this.passedIn作为可选参数。我以为这是为构造函数保留的? class Foo extends St
我使用 sugar orm 库添加数据和检索数据但是数据没有正确检索下面是我的代码主.xml 书.java public class Book exten
我在我的 Android 应用程序中使用 Sugar ORM。我的数据来自服务器,但某些模型具有在设备端填充的额外字段。当我刷新我的数据时,我的设备填充字段被空值覆盖。 目前,我正在执行数据库查询以查
我的 Android 项目中有很多关于 Sugar ORM 的问题。 那是错误: 05-07 18:50:42.173 7252-7252/net.elinformaticoenganchad
大家好,我正在使用 android studio,此时我对如何使用 Sugar ORM 有了相当好的想法,但有一件事我无法找到或弄清楚。 所以我有一个名为 UserProfiles.java 的 Ac
我正在使用 Sugar Professional 6,并且还在社区版本中检查了相同的情况。在项目模块中,我有项目名称,它应该从另一个名为 MSO 的字段自动生成,并带有前缀和自动递增编号。 例如。 M
我使用 Module Loader 在 Sugar CRM 中上传了模块,它显示在列表中,但是当我尝试安装它时显示以下错误。 显示日志 Failed to copy cache/upgrades/te
Select PRODUCT from PRODUCT_TAGS where TAGS = 1 intersect Select PRODUCT from PRODUCT_TAGS where TAG
是否可以创建 Sugar ORM 独有的列?或者是否可以插入或替换指定的行,比方说通过用户名,但是这个用户名可能不在数据库中,因为他可能还没有被创建。 最佳答案 1.3 正式版暂不支持。但是你可以使用
Sugar ORM 在 Android 上完美运行,但在 Android 5> 上它会崩溃。我使用的是 1.4 版本 请帮帮我。 错误:android.database.sqlite.SQLiteE
我正在尝试将 Sugar ORM (v 1.3) 集成到我的 Android 应用程序中,但在尝试保存新创建的实体时我总是遇到崩溃 (NullPointerException)。 这是我的崩溃...
我目前正在使用 Sugar ORM和 Android Async Http Client对于我的 Android 应用程序。 我通读了 Sugar ORM 的文档,并完全按照那里写的去做。我的 Htt
我完全能够通过提供的示例使用 Sugar ORM。 在我的用例中,我从服务器下载了一个 SQLite 数据库(它的 ETL 负载以数百万条记录为单位,因此必须在服务器端完成)。下载保存到内部存储的自定
我是 SugarORM 的新手,我想在我的应用程序中使用这个库。设置此库元标记后,我必须为所有类扩展 SugarRecord,为此我将创建新类作为此示例中的产品 @Table public class
我是一名优秀的程序员,十分优秀!