我可以使用Rcpp加速我的R代码吗?

因为

我定义了一个R函数,其中包含一个矩阵,一个向量和一个参数a我需要针对的不同值计算函数的结果a这很容易编写代码R,但是当矩阵为“大”且参数值的数量很大时,速度非常慢。

我可以在中定义函数R并在其中进行for循环Rcpp吗?

可以加快计算速度吗?

foo函数的最小示例R

f <- function(X,y,a){
  p = ncol(X)
  res = (crossprod(X) + a*diag(1,p))%*%crossprod(X,y)
  }

set.seed(0)
X <- matrix(rnorm(50*5),50,5)
y <- rnorm(50)
a <- seq(0,1,0.1)

result <- matrix(NA,ncol(X),length(a))

for(i in 1:length(a)){                  # Can I do this part in Rcpp?
  result[,i] <- f(X,y,a[i])
  }

result
拉尔夫·斯塔伯纳

李哲源的答案正确地确定了您的情况下应该采取的措施。对于您最初的问题,答案有两个:是的,您可以使用Rcpp将循环移动到C ++。不,您不会获得性能:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericMatrix fillMatrix(Rcpp::NumericMatrix X,
                   Rcpp::NumericVector y,
                   Rcpp::NumericVector a,
                   Rcpp::Function f) {
  Rcpp::NumericMatrix result = Rcpp::no_init(X.cols(), a.length());
  for (int i = 0; i < a.length(); ++i) {
    result(Rcpp::_, i) = Rcpp::as<Rcpp::NumericVector>(f(X, y, a[i]));
  }
  return result;
}

/*** R
f <- function(X,y,a){
  p = ncol(X)
  res = (crossprod(X) + a*diag(1,p))%*%crossprod(X,y)
  }

X <- matrix(rnorm(500*50),500,50)
y <- rnorm(500)
a <- seq(0,1,0.01)

system.time(fillMatrix(X, y, a, f))
#   user  system elapsed 
#  0.052   0.077   0.075 
system.time({result <- matrix(NA,ncol(X),length(a))

for(i in 1:length(a)){
  result[,i] <- f(X,y,a[i])
  }
})
#   user  system elapsed 
#  0.060   0.037   0.049 
*/

因此,在这种情况下,Rcpp解决方案实际上比R解决方案要慢。为什么?因为实际工作是在功能内完成的f这两种解决方案都是相同的,但是Rcpp解决方案具有从C ++回调到R的额外开销。注意,R中的for循环不一定很慢顺便说一句,这里是一些基准数据:

          expr      min       lq     mean   median       uq      max neval
 fillMatrixR() 41.22305 41.86880 46.16806 45.20537 49.11250 65.03886   100
 fillMatrixC() 44.57131 44.90617 49.76092 50.99102 52.89444 66.82156   100

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以使用Collection.size()替换此代码中的计数器吗?

我可以使用多个“ with”吗?

我可以使用LLVM加速构建并减少GCC编译时间吗?

我可以使用已经编写的Jmh微基准来预热生产代码吗

我可以使用FSI调试代码吗?

我可以使用javascript表单吗?

我可以使用迭代器吗?

我可以使用通配符替换吗

我可以使用AWS Lambda满足我的要求吗?

我可以使用管道吗?在R中,不是%>%

我可以使用cpupowerd超频我的cpu吗?

有人可以使用.bind()函数向我解释此代码吗?

我们可以使用Java代码执行Windows Azure PowerShell吗

我可以使用RTF格式吗?

我可以在R标记中使用vim高亮代码吗?

我可以使用相同的代码多次获取Instagram的access_token吗?

我可以使用代码按回车键吗?

骨骼可以使用我的插件吗?

我可以使用R中的一行代码为所有图打开网格吗?

我可以使用VS Code将Arduino代码上传到Arduino吗

我可以使用循环使代码更短吗?

我可以使用 OpenVPN 更改我的位置吗?

我可以使用循环变量或数组来减少我的代码吗

我可以使用其 Java 源代码创建一个简单的 Talend 作业吗?

我可以使用对象的单击命令,使用继承来删除重复代码吗?

我们可以使用尝试来解码霍夫曼代码吗

我可以使用 Rcpp 就地修改行吗?

我可以使用类或列表来提高代码效率吗?

如果我使用citus,我可以使用join吗?