更有效的有界累积和

时间:2014-09-14 18:48:58

标签: r optimization

我有这个R代码需要花费大量时间来执行。如何更改此代码以使其运行更快,更高效?执行需要12分钟以上。

m=matrix(0,10000,10000)
for (j in 1:10000) {
    for (i in 2:10000} {
       x=rnorm(1,0,1)
       m[j,i]=max(0,x-0.5+m[j,i-1])
    }
}
meanC=apply(m,2,mean)[2:10000]
meanC

1 个答案:

答案 0 :(得分:4)

矩阵的每一行都是正态分布的样本的有界累积和减去0.5,限制使得累积量永远不会小于0.有限累积和已在SO上解决before,并且我建议使用Rcpp包的方法:

library(Rcpp)
bounded.cumsum <- cppFunction(
"NumericVector cumsumBounded(NumericVector x, double low) {
  NumericVector res(x.size());
  double acc = 0;
  for (int i=0; i < x.size(); ++i) {
    acc += x[i];
    if (acc < low)  acc = low;
    res[i] = acc;
  }
  return res;
}")
m <- t(sapply(1:10000, function(r) c(0, bounded.cumsum(rnorm(9999, 0, 1)-0.5, 0))))

在我的电脑上,这需要24秒,加速30倍。