迭代构建 bigsparser::SFBM 矩阵

问题描述 投票:0回答:0

我想建立一个有 10^7 列和 2500 行的矩阵。因为这对我的电脑来说太大了,我想我可以迭代地创建矩阵。我想使用 bigsparser 包将矩阵存储在磁盘上。

这是我创建第一个矩阵的方法:

library(bigsparser)
library(data.table)
library(Matrix)
nvars <- 10000000  # columns
ncons <- 10        # rows
n_nonzero <- round(0.02*nvars*ncons) # approximate, there may be actually less values
set.seed(13)

# the first table
Amat <- data.frame(
    i=sample.int(ncons, n_nonzero, replace=TRUE),
    j=sample.int(nvars, n_nonzero, replace=TRUE),
    x=runif(n_nonzero)
)
setDT(Amat)
Amat <- unique(Amat, by=c("i", "j"))
AmatSparse <- sparseMatrix(
    i=Amat[,get("i")], j=Amat[,get("j")], x=Amat[,get("x")],
    dims=c(2500, 10^7L)
)
AmatSFBM <- as_SFBM(AmatSparse, backingfile="sparsemat", compact = FALSE)

如您所见,我事先知道最终矩阵的维度并相应地进行了设置。

现在我想添加一些行,像这样:

for (iter in 2:250) {
    Amat <- data.frame(
        i=sample.int(ncons, n_nonzero, replace=TRUE),
        j=sample.int(nvars, n_nonzero, replace=TRUE),
        x=runif(n_nonzero)
    )
    setDT(Amat)
    Amat <- unique(Amat, by=c("i", "j"))
    Amat[,i:=i+(iter-1)*500]

    # this does not work:
    AmatSFBM[Amat[,get("i")], Amat[,get("j")]] <- Amat[,get("x")]
}

但是,]<- 运算符似乎不适用于 SFBM 对象。

有什么方法可以从稀疏矩阵构建一个 SFBM 对象而不是 as_SFBM 对象?例如,

  • 我可以添加两个相同尺寸的 SFBM 对象吗
  • 我可以从 CSV 文件或类似文件创建 SFBM 对象吗?

两个都可以。

r sparse-matrix sparse-file
© www.soinside.com 2019 - 2024. All rights reserved.