我要使用arma :: mat作为我的矩阵列表。
将R矩阵转换为arma :: mat与const的效果很好。
但是当我使用带有矩阵的List作为参数时,它会花费很长时间。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
int check1(List X)
{
int i;
for (i = 0; i < 10; i ++)
arma::mat y = as<arma::mat>(X[i]);
return 0;
}
// [[Rcpp::export]]
int check2(const List& X)
{
int i;
for (i = 0; i < 10; i ++)
arma::mat y = as<arma::mat>(X[i]);
return 0;
}
// [[Rcpp::export]]
int check3(List X)
{
int i;
for (i = 0; i < 10; i ++)
NumericMatrix y = X[i];
return 0;
}
matlist = lapply(1:10, function(x) matrix(rnorm(10000), 2000, 50))
microbenchmark::microbenchmark(
arma = check1(matlist),
carma = check2(matlist),
nm = check3(matlist)
)
Unit: microseconds
expr min lq mean median uq max neval
arma 558.081 597.6485 622.13757 614.702 625.928 1303.494 100
carma 551.950 600.4425 658.33583 612.761 626.683 1749.153 100
nm 2.288 4.3590 5.57801 5.123 5.901 39.743 100
答案 0 :(得分:2)
似乎正在发生一些复制,这会降低代码的速度。
要在创建Armadillo矩阵时防止复制,一种解决方案是:
// [[Rcpp::export]]
int check4(List X)
{
int i;
for (i = 0; i < 10; i ++) {
NumericMatrix x = X[i];
arma::mat y = arma::mat(x.begin(), x.nrow(), x.ncol(), false);
}
return 0;
}
基准:
Unit: microseconds
expr min lq mean median uq max neval
arma 599.669 606.5465 634.41683 610.4185 632.4370 1519.262 100
carma 600.506 606.0975 624.18013 609.8885 629.5135 1327.891 100
nm 2.100 2.5030 10.88695 3.5180 4.2670 743.220 100
nm_arma 2.949 3.3160 11.48330 4.7625 5.3195 685.302 100
PS:const
和&
不会更改您的Rcpp代码。参见https://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-FAQ.pdf的5.1节。