在 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
可能非常耗时。
我一直在尝试以有效的方式将 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
可能非常耗时。