我定义了一个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] 删除。
我来说两句