У меня есть big.matrix
, который я хочу преобразовать в arma::Mat
, чтобы использовать функциональность линейной алгебры Armadillo.
Тем не менее, я не могу заставить актеров работать.
Насколько я могу понять из чтения, оба внутренне хранятся в основном формате столбца, а фактический матричный компонент big.matrix
является просто указателем типа <T>
(char
/short
/int
/double
)
Следующий код компилируется, но приведение к arma::Mat
не работает, возникает ошибка сегментации при повторении матрицы приведения.
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(BH, bigmemory, RcppArmadillo)]]
#include <bigmemory/BigMatrix.h>
template <typename T>
void armacast(const arma::Mat<T>& M) {
// This segfaults
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 2; i++) {
std::cout << M.at(j, i) << std::endl;
}
}
std::cout << "Success!" << std::endl;
}
// [[Rcpp::export]]
void armacast(SEXP pDat) {
XPtr<BigMatrix> xpDat(pDat);
if (xpDat->matrix_type() == 8) {
// I can iterate over this *mat and get sensible output.
double *mat = (double *)xpDat->matrix();
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 2; i++) {
std::cout << *mat + 2 * (j + 0) + i << std::endl;
}
}
armacast((const arma::Mat<double> &)mat);
} else {
std::cout << "Not implemented yet!" << std::endl;
}
}
In R:
library(Rcpp)
library(RcppArmadillo)
library(bigmemory)
sourceCpp("armacast.cpp")
m <- as.big.matrix(matrix(1:4, 2), type="double")
armacast(m@address)
big.matrix
в файл, а затем использовать метод броненосцаload()
для автоматического получения мата броненосца? - person Emma   schedule 24.07.2014