2016-02-16 2 views
0

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

Тем не менее, чтобы подвести итог немного, мои основные вопросы:

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

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

ответ

0

Возможно, это может быть чрезмерным. Из R вы получаете SEXP, который вы создаете дешево - см. Набор тестов in the RcppArmadillo package.

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

Смежные вопросы