gpt4 book ai didi

c++ - 如何在 bigmemory rcpp 中修改文件支持矩阵的值

转载 作者:行者123 更新时间:2023-11-28 01:40:47 28 4
gpt4 key购买 nike

我正在使用 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;
}
}
}
}

最佳答案

问题源于NA之间的差异在 R 和 NAN在 C++ 中。

MatrixAccessor<int>为您提供类型为 int 的值的访问器. R中的任何数字都可以是NA ,而是一个 int在 C++ 中永远不会是 NAN .优化编译器可以完全忽略 std::isnan(x)其中 x类型为 int ,就像你的情况一样。

要解决此问题,您可以:

  • 使用MatrixAccessor<float> (或 double )。这意味着实际存储不同的数据类型。
  • 检查您实际获得的 NA 的值(value)元素。我想你会发现它是 INT_MIN在 C++ 中 (-2147483648)。替换 isnan(x)x == INT_MIN .

相关:Extracting a column with NA's from a bigmemory object in Rcpp

关于c++ - 如何在 bigmemory rcpp 中修改文件支持矩阵的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47254387/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com