我想在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 ++的新手,但我无法用它来比较速度方面的两个解决方案。
尽管如此,总结一下,我的主要问题是:
自定义类模板解决方案(换句话说,创建一个新类,其中您指定了List组件的类的先验)是as<class>
的唯一替代方法,以实现List组件的矩阵乘法在RcppArmadillo?
如果它确实是唯一的选择,那么它会比使用as<class>
更快吗?
答案 0 :(得分:0)
你可能过于复杂了。从R开始,您可以获得廉价实例化的SEXP
- 请参阅基准in the RcppArmadillo package。
总的来说,剖析可以猜测。试试不同的东西并测量它们......