2
)
R
코드의 길이를 L (psi) 및 행렬 (L, L)의 벡터를 사용하고 요소 별 연산을 수행하는 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;
}
R 코드에'apply'를 사용하지 말고'log' 변수와 함께'colSums'를 사용하여 제품을 얻을 수 있습니다. – James
첫 번째'apply'는't (phi) * psi'와 같습니다. 더 빠를 것입니다. – James
로그를 생각한 다음 exp'ing하고 summing하는 것이 prods보다 훨씬 빠릅니까? – scottyaz