在RcppArmadillo中多次更新一个大矩阵

时间:2016-03-12 00:42:26

标签: c++ r memory-management rcpp armadillo

我有一个main函数多次调用一个辅助函数,它创建了一个相当大的矩阵(10 ^ 8个复数)。到目前为止,我已经有辅助函数每次分配内存并从头开始构建矩阵。是不是最好在main函数中分配一次内存,并将其指针传递给辅助函数来更新它?

我的下面的天真测试表明这确实更有效。

#include <RcppArmadillo.h>
#include <iostream>
// [[Rcpp::depends(RcppArmadillo)]]

// this version returns a new G0 everytime
// [[Rcpp::export]]
arma::cx_mat helper1(int N, int ii) {

  arma::cx_mat G0 = arma::eye<arma::cx_mat>( N, N );
  // dummy calculation
  G0 = 0 * G0 + ii;    
  return(G0);
}

// this version updates G0 defined elsewhere
// [[Rcpp::export]]
void helper2(int N, int ii, arma::cx_mat& G0) {
  // dummy calculation
  G0 = 0 * G0 + ii;
}

// [[Rcpp::export]]
arma::cx_double  main1(int N, int Nl) {

  arma::cx_mat G0 ;
  int ii;
  for (ii=1; ii<Nl; ii++){
    G0 = helper1(N, ii);
  }
  return(G0(1,1));
}

// [[Rcpp::export]]
arma::cx_double main2(int N, int Nl) {

  arma::cx_mat G0 = arma::eye<arma::cx_mat>( N, N );
  int ii;
  for (ii=1; ii<Nl; ii++){
    helper2(N, ii, G0);
  }
  return(G0(1,1));
}

/*** R
main1(100, 10)
main2(100, 10)
library(microbenchmark)
microbenchmark(main1(3000, 50), main2(3000, 50), times = 5)
# Unit: seconds
# expr      min       lq     mean   median       uq      max
#   main1(3000, 50) 7.160945 7.180199 7.218132 7.203668 7.237876 7.307974
# main2(3000, 50) 2.432682 2.432864 2.446226 2.436771 2.439675 2.489136
*/

当然,在实践中,程序会执行各种计算,因此我不确定是否应该依赖此虚拟示例的结果。在我咬紧牙关并将我的所有代码转换为遵循此更新&#39;之前策略,我希望更加自信,这是一个很好的方法......

0 个答案:

没有答案