在Rcpp中,在数值矩阵中分配元素的速度非常慢

时间:2014-07-31 21:41:18

标签: c++ r rcpp

我不熟悉使用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;
}

0 个答案:

没有答案