Поэлементное матричное векторное умножение и деление без присваивания в RcppArmadillo - PullRequest
0 голосов
/ 26 июня 2018

У меня медленная 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)

Мои фактические матрицы и векторы будут намного больше, поэтому потребность в увеличении скорости.

...