使用RcppArmadillo与bigmemory,返回一个bigmatrix

时间:2017-02-10 14:00:41

标签: c++ r rcpp armadillo r-bigmemory

我正在尝试使用big.matrixRcppArmadillo进行一些操作。 问题是我总是需要将结果保持为big.matrix,以避免在RAM中加载数据。这是我创建big.matrix的转置的代码:

big_T.cpp

#define ARMA_NO_DEBUG

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo, BH, bigmemory)]]

using namespace Rcpp;
using namespace arma;

#include <bigmemory/BigMatrix.h>
#include <bigmemory/MatrixAccessor.hpp>

// [[Rcpp::plugins(cpp11)]]


// [[Rcpp::export]]
bool BigArmaT(SEXP pBigMat,SEXP pBigMat_t) {

  XPtr<BigMatrix> xpMat(pBigMat);
  XPtr<BigMatrix> xpMat_t(pBigMat_t);
int NN(xpMat->ncol());
int MM(xpMat->nrow());

arma::Mat<double> aBigMat((double *)xpMat->matrix(), xpMat->nrow(), xpMat->ncol(), false);
arma::Mat<double> tBigMat(aBigMat.t());

MatrixAccessor<double> Am(*xpMat_t);

for (int i = 0; i < MM; i++){
std::memcpy(Am[i],tBigMat.colptr(i) , NN*sizeof(double));
}


  return TRUE;

}

R:

library(Rcpp)
library(RcppArmadillo)
library(bigmemory)

Sys.setenv(PATH="%PATH%;C:/Rtools/gcc-4.6.3/bin;c:/Rtools/bin")

sourceCpp("big_T.cpp")
big_transpose<-function(bigm) {
            new_ptr<-big.matrix(nrow=ncol(bigm),ncol=nrow(bigm),type="double")
            BigArmaT(bigm@address ,new_ptr@address)
            return(new_ptr)
                        }

set.seed(4)
m <- matrix(rnorm(1000*2000), nrow=1000)
bigm <- as.big.matrix(m,type="double")


t_big<-big_transpose(bigm)
t_m<-t(as.matrix(bigm))
all.equal(t_m,as.matrix(t_big))
  

[1] TRUE

我发现我的尝试效率不高有两个原因:

  1. 我需要在R代码中创建第二个big.matrix。是 有一种方法可以创建指向新big.matrix的外部指针 c ++里面的对象?
  2. 要做工作memcpy我必须创建一个循环。     如何一次复制矩阵?

0 个答案:

没有答案