在 R 中将 ddiMatrix 转换为 Bigmatrix 的有效方法

Efficient way of transforming a ddiMatrix to Bigmatrix in R

我一直在尝试以有效的方式将 ddiMatrix(对角矩阵)转换为 R 中的 Bigmatrix,但没有成功,因为我的矩阵很大。

我设法做到这一点的唯一方法是先将其传递为矩阵形式,然后将其转换为 big.matrix 形式,如下例所示。

library(Matrix)
library(bigmemory)

DM <- Diagonal(x = c(1,2,3,4)) 
DM <- as.big.matrix(as.matrix(DM))

正如我的基准指标所示,这非常耗费内存(因此很慢)。

有什么想法吗? (使用 Rcpp 或其他任何方式)

我担心这可能是不可避免的,因为您正在从 稀疏 矩阵转换为 密集 矩阵。

考虑您的示例,但初始对角矩阵稍大,并且有明确的中间步骤:

> sparseDM <- Matrix::Diagonal(x = as.numeric(1:100))
> denseM <- Matrix::as.matrix(sparseDM)
> bigM <- bigmemory::as.big.matrix(denseM)
> 
> dang::ls.objects()    # simple helper function in a package of mine
               Type  Size Rows Columns
bigM     big.matrix   696  100     100
denseM       matrix 80216  100     100
sparseDM  ddiMatrix  2040  100     100
> 

如您所见,稀疏矩阵在 100 个元素(加上一些内部索引)处比 100 x 100 密集矩阵(大约 100^2 * 8字节,加上 SEXP 开销的位)。 bigmemory 对象然后 看起来很小 到 R 因为它的分配在 R 之外,但作为 dense 矩阵它仍然存储您并不真正关心的所有非对角线元素。

简而言之,听起来您想要 'bigmemory-alike sparse matrix' class。据我所知,没有人写过。

这是我设法做到的,避免了 ddiMatrix 格式。我想它只适用于那些希望专门使用 big.matrix 的人。

library(bigmemory)

dim = 2
main.diag <- seq(from=1,to=dim,by=1)
BM0 <- big.matrix(dim, dim,init=0)
BM0[cbind(1:dim, 1:dim)] <- main.diag
BM0[]

提醒一句:初始化一个大 big.matrix 可能非常耗时。