Я пытаюсь сделать некоторые операции с big.matrix
с помощью RcppArmadillo
,
Проблема в том, что мне всегда нужно сохранять свои результаты как big.matrix
избегая загрузки данных в оперативную память. Это мой код, где я создаю транспонирование 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;
}
Р:
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] ИСТИНА
Я нахожу свои попытки неэффективными по двум причинам:
big.matrix
внутри кода R Являетсяbig.matrix
memcpy
Я должен был создать петлю.Задача ещё не решена.
Других решений пока нет …