Я хочу создать функцию в RcppArmadillo, которая принимает в качестве входных данных два списка a и b, а затем возвращает список «out», который содержит в качестве компонентов матричный продукт соответствующих компонентов и b: out (i) = a (i) * b (i) (в цикле for). Я заранее знаю, что все компоненты списков a и b будут матрицами.Матричное умножение компонентов списка в RcppArmadillo
Это может быть достигнуто в RcppArmadillo с использованием as<arma::mat>
, как в следующем примере кода:
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::export]]
List test_1(List a, List b){
List out(a.size());
for (int i=0; i<a.size(); i++){
out(i) = as<arma::mat>(a(i))*as<arma::mat>(b(i));
}
return out;
}
Однако, поскольку это intented для использования в качестве части алгоритма MCMC с целью сделать его быстрее, и потому что я также посмотрел на этот пост: Index element from list in Rcpp
Я бродил ли использование такой указанный пользователем класс как ListOf<arma::mat>
, например, приведет к ускорению вычислений по сравнению с выше кодом. Я попытался сравнить его, используя шаблон класса ListOf, данный Романом Франсуа в ссылке. Тем не менее, я не мог заставить его работать с ошибкой «ссылка на« ListOf »неоднозначна» при попытке исправить код. Более того, я попытался исправить весь код Romain Francois в приведенной выше ссылке и по-прежнему получил ту же ошибку. Поэтому, несмотря на то, что я не испытываю опыта в создании своих собственных шаблонов классов, поскольку я являюсь своего рода новым в Rcpp и C++, я не мог сравнить его с точки зрения скорости.
Тем не менее, чтобы подвести итог немного, мои основные вопросы:
ли шаблон пользовательского класса решение (другими словами, создавая новый класс, где вы указываете априорно класс компонентов List) единственная альтернатива
as<class>
, чтобы добиться матричного умножения компонентов списка в RcppArmadillo?Если это единственная альтернатива, было бы быстрее, чем использовать
as<class>
?