RcppArmadillo中列表组件的矩阵乘法

时间:2016-02-16 10:59:55

标签: c++ list rcpp matrix-multiplication

我想在RcppArmadillo中创建一个函数,它将两个列表a和b作为输入,然后返回一个List“out”,其中包含a和b的相应组件的矩阵乘积作为组件:out(i) = a(i)* b(i)(在for循环中)。这是我事先知道列表a和b的所有组成部分都是矩阵。

这可以通过使用as<arma::mat>在RcppArmadillo中实现,如下面的代码示例所示:

#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算法用作其中一部分,目的是让它更快,因为我也看了一下这篇文章: Index element from list in Rcpp

如果使用这样的用户指定的类(例如ListOf<arma::mat>),我会徘徊,与上面的代码相比,会导致更快的计算。我尝试使用Romain Francois在链接中给出的ListOf类模板对其进行基准测试。但是,当尝试获取代码时,我无法使错误“引用'ListOf'是不明确的”。此外,我试图在上面的链接中获取Romain Francois的整个代码,但仍然得到了相同的错误。因此,尽管我在创建自己的类模板方面没有经验,因为我是Rcpp和C ++的新手,但我无法用它来比较速度方面的两个解决方案。

尽管如此,总结一下,我的主要问题是:

  1. 自定义类模板解决方案(换句话说,创建一个新类,其中您指定了List组件的类的先验)是as<class>的唯一替代方法,以实现List组件的矩阵乘法在RcppArmadillo?

  2. 如果它确实是唯一的选择,那么它会比使用as<class>更快吗?

1 个答案:

答案 0 :(得分:0)

你可能过于复杂了。从R开始,您可以获得廉价实例化的SEXP - 请参阅基准in the RcppArmadillo package

总的来说,剖析可以猜测。试试不同的东西并测量它们......