Матричное умножение компонентов списка в RcppArmadillo

Я хочу создать функцию в 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++, мне не удалось сравнить два решения с точки зрения скорости.

Тем не менее, если немного подытожить, то мои основные вопросы таковы:

  1. Является ли решение пользовательского шаблона класса (другими словами, создание нового класса, в котором вы априори указываете класс компонентов списка) единственной альтернативой as<class> для достижения матричного умножения компонентов списка в RcppArmadillo?

  2. Если это действительно единственная альтернатива, будет ли это быстрее, чем использование as<class>?


person G. Papageorgiou    schedule 16.02.2016    source источник


Ответы (1)


Возможно, вы слишком усложняете это. Из R вы получаете SEXP, который вы создаете дешево — см. набор эталонных тестов в пакете RcppArmadillo.

И вообще, профилирование бьет догадки. Просто попробуйте разные вещи и измерьте их...

person Dirk Eddelbuettel    schedule 16.02.2016