Rcpp 中的元素矩阵乘法
element wise matrix multiplication in Rcpp
我正在尝试使用Rcpp
加速一些R
代码,该代码采用长度为 L (psi( 的向量和维度矩阵 (L,L( 并执行一些元素操作。有没有更有效的方法可以使用 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;
}
您可以将循环apply
替换为矢量化替代方案。
第一个相当于:
t(phi)*psi
第二个:
1-exp(colSums(log(1-psi.times.phi)))
#test data
phi <- matrix(runif(1e6),1e3)
psi <- runif(1e3)
#new function
UpdateLambda2 <- function(psi,phi) 1-exp(colSums(log(1-t(phi)*psi)))
#sanity check
identical(UpdateLambda(psi,phi),UpdateLambda2(psi,phi))
[1] TRUE
#timings
library(rbenchmark)
benchmark(UpdateLambda(psi,phi),UpdateLambda2(psi,phi))
test replications elapsed relative user.self sys.self
1 UpdateLambda(psi, phi) 100 16.05 1.041 15.06 0.93
2 UpdateLambda2(psi, phi) 100 15.42 1.000 14.19 1.19
好吧,它似乎没有太大区别,这非常令人惊讶,因为colSums
通常比apply
快得多。我不确定我使用的测试数据是否相关,因为输出都是第二部分中小于 1 的数字1
的到期乘法次数。如果你想注意这么小的数字的细节,你可能最好在对数刻度中工作。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- Rcpp::Vector <RTYPE>的类返回元素的模板
- r语言 - 使用冒号 (':') 访问数组中的元素 C++ (在 Rcpp 中)
- Rcpp犰狳:对列表元素的"-="操作
- 删除矩阵元素,并在rcpp中赋予它新的大小和元素
- 元素矩阵乘法:R与Rcpp(如何加速这段代码?)
- Rcpp 中的元素矩阵乘法