R 更有效的有界累积和

R 更有效的有界累积和,r,optimization,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 矩阵中的每一行都是正态分布减去0.5的样本的有界累

我有一个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

矩阵中的每一行都是正态分布减去0.5的样本的有界累积和,因此,你的累积值永远不会小于0。有界累积金额已在这方面得到解决,我建议使用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))))
库(Rcpp)

bounded.cumsum矩阵的每一行都是正态分布减去0.5的样本的有界累积和,因此,你的累积值永远不会小于0。有界累积金额已在这方面得到解决,我建议使用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))))
库(Rcpp)
有界的,有界的,有界的,有界的,有界的,有界的,有界的,有界的。