2

長さ L (psi) のベクトルと次元 (L,L) の行列を取り、いくつかの要素単位の操作を行うRコードを高速化しようとしています。Rcppこれらの要素単位の操作を Rcpp で行うより効率的な方法はありますか?

r:

 UpdateLambda <- function(psi,phi){
                                      # updated full-day infection probabilites
    psi.times.phi <- apply(phi,1,function(x) x*psi)
    ## return Lambda_{i,j} = 1 - \prod_{j} (1 - \psi_{i,j,t} \phi_{i,j})
    apply(psi.times.phi,2,function(x) 1-prod(1-x))
  }

cpp:

#include <Rcpp.h>
#include <algorithm>
using namespace Rcpp;


// [[Rcpp::export]]
NumericVector UpdateLambdaC(NumericVector psi,
                NumericMatrix phi
                ){

  int n = psi.size();
  NumericMatrix psi_times_phi(n,n);
  NumericVector tmp(n,1.0);
  NumericVector lambda(n);

  for(int i=0; i<n;i++){
    psi_times_phi(i,_) = psi*phi(i,_);
   }

  for(int i=0; i<n;i++){
     // \pi_{j} (1- \lambda_{i,j,t})
    for(int j=0; j<n;j++){
      tmp[i] *= 1-psi_times_phi(i,j);
    }
     lambda[i] = 1-tmp[i];
  }

  return lambda;
}
4

1 に答える 1