我正在转换RcppArmadillo的R函数比较慢。我对Rcpp和RcppArmadillo非常陌生。我设法编写了一些可行的代码,但是它看上去很笨拙,而且可能没有那么快。主要是,我很好奇如何对输出执行矩阵矢量逐元素乘法或除法而无需先将其分配给新对象。例如,这是我的RcppArmadillo函数,可以正常工作:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
arma::mat TTD(arma::mat X, arma::vec d, arma::vec taubar){
arma::vec top = d % sqrt(taubar);
arma::mat cubed = pow(X,3) * 4 * datum::pi;
arma::mat out = repmat(top,1,X.n_cols)/sqrt(cubed.each_col() % d);
return out;
}
但是,我可以做类似的事情(我知道这是错误的):pow(X,3).n_cols() % d * 4 * datum::pi
吗?而且如何在不使用top
或不首先将repmat
的乘积分配给新对象的情况下将向量d % sqrt(taubar)
除以矩阵呢?我不想更改任何输入,因为稍后需要在R中使用它们来实现其他功能。
下面是测试该功能的R代码:
library(RcppArmadillo)
library(Rcpp)
sourceCpp("TTD.cpp")
d <- c(53.638145, 9.617256, 1.450767)
ttau <- matrix(c(36.405117983, 1.707159588, 0.000010000, 36.406568363, 1.707759972, 0.001141475,
36.408022369, 1.708361856, 0.002275780, 36.409480010, 1.708965246, 0.003412920),
nrow = 3, ncol = 4)
tau_bar <- c(66.48201, 9.90116, 6.08173)
TTD(X = ttau, d = d,taubar = tau_bar)
我的实际矩阵和向量会更大,因此需要提高速度。