8

我想将一个大矩阵传递给一个 RcppArmadillo 函数(大约 30,000*30,000),并且感觉这种传递本身就消耗了所有的性能提升。这里也提出了这个问题,并提出了使用带参数的高级构造函数的解决方案copy_aux_mem = false。这似乎也是一个很好的解决方案,因为我只需要从矩阵中读取行而不更改任何内容。我在正确实施解决方案时遇到问题。这可能只是一个简单的语法问题。

这是我当前的函数调用设置(当然是简化的):

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec test(arma::mat M) {
    return(M.row(0))
}

这对于大型矩阵 M 来说非常慢(例如M=matrix(rnorm(30000*30000), nrow=30000, ncol=30000)。所以我想使用这里记录的高级构造函数。语法是mat(aux_mem*, n_rows, n_cols, copy_aux_mem = true, strict = true)并且copy_aux_mem应该设置为false“按引用传递”。我只是不确定中的语法函数定义。我如何在中使用它arma::vec test(arma::mat M) {

4

2 回答 2

16

这已在 Rcpp 邮件列表中进行了广泛讨论。看到这个线程。已经实现的解决方案是通过引用RcppArmadillo传递。arma::mat在内部,这将为您调用高级构造函数。

因此,使用此版本,您将执行以下操作:

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec test(const arma::mat& M) {
    // do whatever with M
    ...
}

并且来自 R 矩阵的数据不是复制而是借来的。线程中的更多详细信息。

以下是一些比较通过引用复制或传递所需时间的基准:

                 expr      min        lq    median        uq      max neval
    arma_test_value(m) 3540.369 3554.4105 3572.3305 3592.5795 4168.671   100
      arma_test_ref(m)    4.046    4.3205    4.7770   15.5855   16.671   100
arma_test_const_ref(m)    3.994    4.3660    5.5125   15.7355   34.874   100

使用这些功能:

#include <RcppArmadillo.h>
using namespace Rcpp ;

// [[Rcpp::depends("RcppArmadillo")]]

// [[Rcpp::export]]
void arma_test_value( arma::mat x){}

// [[Rcpp::export]]
void arma_test_ref( arma::mat& x){}

// [[Rcpp::export]]
void arma_test_const_ref( const arma::mat& x){}
于 2013-09-18T10:47:52.523 回答
5

使用 CRAN 版本RcppArmadillo,您将使用这种语法:

void foo( NumericMatrix x_ ){
    arma::mat M( x_.begin(), x_.nrow(), x_.ncol(), false ) ;
    // do whatever with M
}

这已在许多地方使用,包括 Rcpp 库中的几篇文章。

于 2013-09-18T10:50:45.223 回答