等效于 R 中 big.matrix 的 row() 和 col()

Posted

技术标签:

【中文标题】等效于 R 中 big.matrix 的 row() 和 col()【英文标题】:Equivalent of row() and col() for big.matrix in R 【发布时间】:2018-02-15 11:16:43 【问题描述】:

我正在使用 bigmemory 包来处理大小为 8000 x 8000 的大型矩阵。

对于大矩阵,row() 和 col() 的等价物是什么?

当我尝试使用上述两个函数访问 big.matrix 对象时,我收到以下错误。

“行(phi)中的错误:需要一个类似矩阵的对象作为'行'的参数”

下面是我的代码 sn-p。

k <- big.matrix(nrow = 8000, ncol = 8000, type = 'double', init = 0)
k <- ifelse(row(k) < col(k), 0, (row(k)-col(k))^5 + 2)

【问题讨论】:

8000x8000 只有 500Mb。也许您在这里不需要 bigmemory。我认为你应该用 Rcpp 来编写这个函数。 请注意,如果您的问题非常具体,您可以在 NumericVector tab 中预先计算 pow(x, 5) + 2 for x in [0; n[ 并在循环中直接使用 tab[i - j] 。预计计算时间会大幅减少。 【参考方案1】:

因此,使用 Rcpp,您可以:

// [[Rcpp::depends(BH, bigmemory)]]
#include <bigmemory/MatrixAccessor.hpp>
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void fillBM(SEXP pBigMat) 

  XPtr<BigMatrix> xpMat(pBigMat);
  MatrixAccessor<double> macc(*xpMat);

  int n = macc.nrow();
  int m = macc.ncol();

  for (int j = 0; j < m; j++) 
    for (int i = j; i < n; i++) 
      macc[j][i] = pow(i - j, 5) + 2;
    
  


/*** R
library(bigmemory)
k <- big.matrix(nrow = 8000, ncol = 8000, type = 'double', init = 0)
k.mat <- k[]

system.time(
  fillBM(k@address)
)
k[1:5, 1:5]

system.time(
  k.mat <- ifelse(row(k.mat) < col(k.mat), 0, (row(k.mat)-col(k.mat))^5 + 2)
)
k.mat[1:5, 1:5]
all.equal(k.mat, k[])
*/

Rcpp 函数需要 2 秒,而 R 版本(在标准 R 矩阵上)需要 10 秒(以及更多内存)。

【讨论】:

以上是关于等效于 R 中 big.matrix 的 row() 和 col()的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中计算 big.matrix 的行总和?

如何在 R 中有效地使用 big.matrix 进行交叉验证?

计算 R 中 big.matrix 的对角线

R中几个big.matrix对象的元素平均值

如何释放崩溃 R 会话的 big.matrix 对象使用的内存

R bigmemory 不会读取大的 csv 文件