У меня медленная R-функция, которую я конвертирую в RcppArmadillo. Я очень новичок в 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)
Мои фактические матрицы и векторы будут намного больше, поэтому потребность в увеличении скорости.