我不熟悉使用Rcpp和C ++进行编程。所以我希望这个问题不是太基础。
我正在尝试编写一些代码,这些代码会在给定输入的情况下返回数值矩阵。代码涉及几个循环,见下文。不幸的是,目前它非常缓慢。但是,如果我们运行代码而不将计算出的数字分配给矩阵,则程序会立即运行。同样,如果我们稍微更改计算出的数字以排除下面的“tmp”(请参阅下面的注释部分),它会立即运行(请参阅下面的注释部分)。
非常感谢任何有关如何更快地运行这些内容的提示!如果这篇写得不好的代码冒犯了你,请道歉。
代码:
// [[Rcpp::export]]
NumericMatrix llinftime(NumericMatrix infmat,
NumericMatrix d,
IntegerVector times,
NumericVector theta,
NumericVector pop) {
int nrow = infmat.nrow();
int ncol = infmat.ncol();
NumericMatrix ll(nrow,ncol);
int tmax;
double pj;
double lambdajt;
double pi;
double dij;
double tmp;
double pk;
double djk;
for (int j=0; j<nrow;j++){
tmax = times[j];
pj= log(pop[j]) * theta[0];
for (int t=0;t<tmax;t++){
lambdajt = 0;
for (int i=0; i<nrow;i++){
if (i==j){
continue;
}
pi= log(pop[i]) * theta[1];
dij= log(d(i,j)) * theta[2];
tmp = 0;
for (int k=0; k<nrow;k++){
if (k==j){
continue;
}
pk = pow(pop[k],theta[1]);
djk = pow(d(j,k),theta[2]);
tmp += pk * djk;
}
lambdajt += exp(theta[4]+pi+pj+dij+log(tmp)*theta[3])*infmat(i,t);
//when we take tmp out it becomes instantaneous
//lambdajt +=exp(theta[2]+pi+pj+dij)*infmat(i,t);
}
ll(j,t)=lambdajt + exp(theta[5]);
}
}
return ll;
}