2
我試圖加速一些R
代碼與Rcpp
需要一個長度爲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',並使用'colSums'和'log'ed變量來獲得產品。 – James 2013-02-14 08:39:20
第一個'apply'相當於't(phi)* psi',這應該是更快的 – James 2013-02-14 08:46:46
你認爲日誌,然後exp'ing和求和會比prods快得多? – scottyaz 2013-02-14 09:10:16