- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是这个问题的后续问题:Generating same random variable in Rcpp and R
我正在尝试加快对这种形式的 rbinom 的矢量化调用:
x <- c(0.1,0.4,0.6,0.7,0.8)
rbinom(length(x),1 ,x)
cppFunction("NumericVector cpprbinom(int n, double size, double prob) { \
return(rbinom(n, size, prob)); }")
set.seed(42); cpprbinom(10, 1, 0.5)
cpprbinom(length(x), 1, x)
最佳答案
按照德克的回应 here :
Is there a way of fixing the code without using an explicit loop in the C++ code?
我不这么认为。该代码目前具有以下硬连线:<...> 所以
直到我们中的一个人有足够的 [时间] 来扩展(并测试它)
在你的最后做循环。
这是我对“矢量化”代码的实现:
library(Rcpp)
cppFunction("NumericVector cpprbinom(int n, double size, NumericVector prob) {
NumericVector v(n);
for (int i=0; i<n; i++) {v[i] = as<double>(rbinom(1, size, prob[i]));}
return(v); }")
r <- runif(1e6)
all.equal({set.seed(42); rbinom(length(r), 1, r)},
{set.seed(42); cpprbinom(length(r), 1, r)})
#TRUE
但问题是(再次引用德克),
And I suggest that before expending a lot of effort on this you check whether you are likely to do better than the R function rbinom. That R function is vectorized in C code and you are unlikely to make things much faster by using Rcpp, unless you want to use the random variates in another C++ function.
而且它实际上更慢(在我的机器上为 x3),所以至少像我这样天真的实现无济于事:
library(microbenchmark)
microbenchmark(rbinom(length(r), 1, r), cpprbinom(length(r), 1, r))
Unit: milliseconds
expr min lq mean median uq max neval
rbinom(length(r), 1, r) 55.50856 56.09292 56.49456 56.45297 56.65897 59.42524 100
cpprbinom(length(r), 1, r) 117.63761 153.37599 154.94164 154.29623 155.37247 225.56535 100
编辑:根据下面 Romain 的评论,这是一个高级版本,速度更快!
cppFunction(plugins=c("cpp11"), "NumericVector cpprbinom2(int n, double size, NumericVector prob) {
NumericVector v = no_init(n);
std::transform( prob.begin(), prob.end(), v.begin(), [=](double p){ return R::rbinom(size, p); });
return(v);}")
r <- runif(1e6)
all.equal({set.seed(42); rbinom(length(r), 1, r)},
{set.seed(42); cpprbinom(length(r), 1, r)},
{set.seed(42); cpprbinom2(length(r), 1, r)})
#TRUE
microbenchmark(rbinom(length(r), 1, r), cpprbinom(length(r), 1, r), cpprbinom2(length(r), 1, r))
Unit: milliseconds
expr min lq mean median uq max neval
rbinom(length(r), 1, r) 55.26412 56.00314 56.57814 56.28616 56.59561 60.01861 100
cpprbinom(length(r), 1, r) 113.72513 115.94758 122.81545 117.24708 119.95134 168.47246 100
cpprbinom2(length(r), 1, r) 36.67589 37.12182 38.95318 37.37436 37.97719 84.73516 100
关于r - 矢量化 Rcpp 随机二项式绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29430726/
我想将函数参数中的默认值设置为 Rcpp::Function 参数。 只是简单的赋值,Rcpp::Function func = mean , 不可能。它返回错误:no viable conversi
我正在处理需要逐元素矩阵乘法的代码。我试图在 Rcpp 中实现这一点,因为代码需要一些昂贵的循环。我对 Rcpp 还很陌生,可能会遗漏一些东西,但我无法使逐元素矩阵乘法工作。 // [[Rcpp::e
在 C++ 中,我们可以声明一个变量作为引用。 int a = 10; int& b = a; 如果我们设置 b=15 , a 也会改变。 我想在 Rcpp 中做类似的事情。 List X = obj
我正在阅读很棒的 Rcpp vignette关于使用 Rcpp 模块公开 C++ 类和函数。在这种情况下,是否可以创建一个 Rcpp 函数,该函数具有一个类型为 Uniform 的类作为参数之一,并且
我在 R 中有一个命名列表: l = list(a=1, b=2) 我想在 Rcpp 中使用这个列表,并迭代值和名称。理想情况下,它可能类似于(为简洁起见使用 C++11 格式): void prin
这个问题在这里已经有了答案: Rcpp - sourceCpp - undefined symbol (2 个答案) 关闭 4 年前。 我现有的 C 代码由三个文件组成:头文件(“.h”文件)、库文
我目前正在为类作业编写模拟退火算法(“解决”背包问题),并想在 Rcpp 中完成(我必须使用 R,而 Rcpp 更快)。 Rcpp 一直给我以下错误 invalid static_cast from
根据我的理解,在 Rcpp 和 C++ 之间转换 vector 会创建新 vector ,如下所示。我的理解对吗? 将 Rcpp vector 转换为 C++ vector 时,我们使用 Rcpp::
我想将参数的默认值设置为 NULL在Rcpp如果参数不是NULL,则函数并根据参数进行一些计算.这种代码的一个例子是 #include using namespace Rcpp; // [[Rcpp
任何人都可以解释以下行为吗? 当声明一个新的NumericMatrix时,y,作为原始矩阵,x,乘以一个标量,c,标量/矩阵乘法的顺序很重要。如果我将左侧的标量与右侧的矩阵相乘(例如 NumericM
有一种方法可以使用 NA 值初始化数值向量,例如。 NumericVector x(10,NumericVector::get_na()) 有没有类似的方法可以将矩阵初始化为 NA 值? 最佳答案 这
这可能是一个非常简单的问题,但我不知道哪里出了问题。 我有一个传递给 Rcpp 函数的列表,该列表的第一个元素是一个 data.frame。 我如何获取该 data.frame? bar = list
我正在尝试开发一个使用 Sundials 的 R 包用于求解微分方程的 C 库。为了不让用户安装库,我将库的源代码放在我的包中。 我已将库中的所有头文件放入 /inst/include/sundial
我正在研究一个同时使用 Rcpp::IntegerVector (行/列指针)和模板化 std::vector 的 Rcpp 稀疏矩阵类。基本原理是,在极大的稀疏矩阵中深度复制整数指针 vector
我想将一个R函数翻译成Rcpp,一个简单的测试代码如下,但我不知道如何处理默认设置为NULL的参数。 test t=R_NilValue, Rcpp
我想将一个R函数翻译成Rcpp,一个简单的测试代码如下,但我不知道如何处理默认设置为NULL的参数。 test t=R_NilValue, Rcpp
我想公开一个 C++ 类和一个将该类的对象作为 R 参数的函数。我必须遵循简化的示例。我使用创建了一个包 Rscript -e 'Rcpp::Rcpp.package.skeleton("soq")'
我想用 Rcpp 编写一个 C++ 函数,它使用 hypred 包中的 C 函数,它在 CRAN here 上. 我读了using C function from other package in R
[我在别处将其草拟为评论,但决定创建一个适当的问题...] 在 Rcpp 中使用数据帧时,就代码结构而言,目前被认为是“最佳实践”的是什么?从 R 到 C++ 代码的输入数据帧“传输”非常容易,但是如
我正在尝试使用 Rcpp::CharacterMatrix 并将每一行转换为 Rcpp::List 中它自己的元素。 但是,我为此编写的函数有一个奇怪的行为,即列表的每个条目都对应于矩阵的最后一行。为
我是一名优秀的程序员,十分优秀!