【发布时间】:2017-11-12 21:49:19
【问题描述】:
我正在使用 R bigmemory 包和 Rcpp 来处理大矩阵(1 到 1000 万列 x 1000 行)。一旦我将由 0、2 和 NA 组成的整数矩阵读入 R 中的文件备份大内存矩阵,我想通过 C++ 修改所有 NA 值,以便对每列的平均值或任意值进行插补(我在这里显示后者)。
下面是我写的 Rcpp 函数,它不起作用。我希望从 R 中调用 BigNA(mybigmatrix@address) 可以在矩阵中找到 NA 的元素并直接在支持文件中修改其值。
我认为问题可能出在std::isnan(mat[j][i])的评估上。我通过创建一个替代函数来检查这一点,该函数使用累加器计算 NA 值,并且确实没有计算任何 NA。但是一旦解决了这个问题,我也不确定表达式mat[j][i] = 1 是否会修改支持文件中的值。对于有 R 背景的我来说,写这些语句感觉很直观,但可能是错误的。
非常感谢任何帮助/建议。
#include <stdio.h>
#include <Rcpp.h>
#include <bigmemory/MatrixAccessor.hpp>
#include <numeric>
// [[Rcpp::depends(BH, bigmemory)]]
// [[Rcpp::depends(Rcpp)]]
// [[Rcpp::export]]
void BigNA(SEXP pBigMat) {
/*
* Imputation of "NA" values for "1" in a big 0, 2 NA matrix.
*/
// Create the external bigmatrix pointer and iniciate matrix accessor
XPtr<BigMatrix> xpMat(pBigMat);
MatrixAccessor<int> mat = (*xpMat);
// Iterater over the elements in a matrix and when NA is found, substitute for "1"
for(int i=0; i< xpMat->ncol(); i++){
for(int j=0; j< xpMat->nrow(); j++){
if(std::isnan(mat[j][i])){
mat[j][i] = 1;
}
}
}
}
【问题讨论】:
标签: c++ rcpp r-bigmemory