Я хочу создать функцию в RcppArmadillo, которая принимает на вход два списка a и b, а затем возвращает список "out", который содержит в качестве компонентов матричное произведение соответствующих компонентов a и b: out(i) = a( i)*b(i) (в цикле for). То есть я заранее знаю, что все компоненты списков a и b будут матрицами.
Этого можно добиться в 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;
}
Однако, поскольку это предназначено для использования как часть алгоритма MCMC с целью сделать его быстрее, и поскольку я также просмотрел этот пост: Индексировать элемент из списка в Rcpp
Я размышлял, приведет ли использование такого определяемого пользователем класса, как, например, ListOf<arma::mat>
, к более быстрым вычислениям по сравнению с приведенным выше кодом. Я попытался сравнить его, используя шаблон класса ListOf, предоставленный Роменом Франсуа в ссылке. Однако мне не удалось заставить его работать, получая сообщение об ошибке «ссылка на ‘ListOf’ неоднозначна» при попытке получить исходный код. Более того, я попытался получить весь код Ромена Франсуа по ссылке выше и все равно получил ту же ошибку. Поэтому, несмотря на то, что у меня нет опыта создания собственных шаблонов классов, так как я новичок в Rcpp и C++, мне не удалось сравнить два решения с точки зрения скорости.
Тем не менее, если немного подытожить, то мои основные вопросы таковы:
Является ли решение пользовательского шаблона класса (другими словами, создание нового класса, в котором вы априори указываете класс компонентов списка) единственной альтернативой
as<class>
для достижения матричного умножения компонентов списка в RcppArmadillo?Если это действительно единственная альтернатива, будет ли это быстрее, чем использование
as<class>
?