构建巨型块身份矩阵的内存高效方法?
Memory-efficient way to build giant block identity matrices?
在 R 中,我尝试使用以下代码将多个单位矩阵行绑定到 1 个巨型矩阵中:
> X <- 4
> Y <- 3
> block1 <- diag(X)
> for(x in 2:Y) {
> block1 <- cbind(block1,diag(X))
> }
应该是这样的:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] 1 0 0 0 1 0 0 0 1 0 0 0
[2,] 0 1 0 0 0 1 0 0 0 1 0 0
[3,] 0 0 1 0 0 0 1 0 0 0 1 0
[4,] 0 0 0 1 0 0 0 1 0 0 0 1
我觉得有一种更干净、占用内存更少的方法可以做到这一点。事实是我的 X 是几千,Y 是 20 多岁,所以生成矩阵 'from scratch' 而不在 for 循环中使用这些替换是首选,因为我遇到了内存阻塞。我尝试查看 Matrix
包中的 bdiag()
,但该功能并不是我想要的。
那么有没有函数可以做到这一点'from scratch'?
编辑:
用户非常友好地建议我查看 'sparse Matrices.' 我遇到了 SparseM
包并且我 99% 在那里。我只是使用 as.matrix.csr
函数将我的矩阵转换为 CSR
格式,并且与 cbind.matrix.csr
和 rbind.matrix.csr
一起我可以有效地获得我需要的所有矩阵。现在的问题是,当我尝试在线性规划求解器 (Rsymphony
) 中使用它时,我必须使用 as.matrix()
将 CSR 矩阵转换回正常状态,但它仍然给我带来内存问题。
正如@OChristiaanse 所建议的那样,稀疏矩阵可能是可行的方法。你可以试试这个简短的电话,看看它是否适合你。
library(Matrix)
do.call(cBind, replicate(Y, Diagonal(X)))
4 x 12 sparse Matrix of class "dgCMatrix"
[1,] 1 . . . 1 . . . 1 . . .
[2,] . 1 . . . 1 . . . 1 . .
[3,] . . 1 . . . 1 . . . 1 .
[4,] . . . 1 . . . 1 . . . 1
看到您还使用非稀疏数据(即不是 zeros/ones)并且存在内存问题,您可能需要查看 bigmemory
包。使用这些对象,您可以使用文件备份并拥有比可用内存更大的对象。
编辑
在与 bigmemory
维护者交谈后,我了解到您可以为 Windows 安装它。它不在 CRAN 上,因为 BH
包(它依赖于它)从 C++ boost 库生成警告。要在 Windows 上安装它,您需要安装 Rtools,然后从 github 存储库安装。
devtools::install_github("kaneplusplus/bigmemory")
在 R 中,我尝试使用以下代码将多个单位矩阵行绑定到 1 个巨型矩阵中:
> X <- 4
> Y <- 3
> block1 <- diag(X)
> for(x in 2:Y) {
> block1 <- cbind(block1,diag(X))
> }
应该是这样的:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] 1 0 0 0 1 0 0 0 1 0 0 0
[2,] 0 1 0 0 0 1 0 0 0 1 0 0
[3,] 0 0 1 0 0 0 1 0 0 0 1 0
[4,] 0 0 0 1 0 0 0 1 0 0 0 1
我觉得有一种更干净、占用内存更少的方法可以做到这一点。事实是我的 X 是几千,Y 是 20 多岁,所以生成矩阵 'from scratch' 而不在 for 循环中使用这些替换是首选,因为我遇到了内存阻塞。我尝试查看 Matrix
包中的 bdiag()
,但该功能并不是我想要的。
那么有没有函数可以做到这一点'from scratch'?
编辑:
用户非常友好地建议我查看 'sparse Matrices.' 我遇到了 SparseM
包并且我 99% 在那里。我只是使用 as.matrix.csr
函数将我的矩阵转换为 CSR
格式,并且与 cbind.matrix.csr
和 rbind.matrix.csr
一起我可以有效地获得我需要的所有矩阵。现在的问题是,当我尝试在线性规划求解器 (Rsymphony
) 中使用它时,我必须使用 as.matrix()
将 CSR 矩阵转换回正常状态,但它仍然给我带来内存问题。
正如@OChristiaanse 所建议的那样,稀疏矩阵可能是可行的方法。你可以试试这个简短的电话,看看它是否适合你。
library(Matrix)
do.call(cBind, replicate(Y, Diagonal(X)))
4 x 12 sparse Matrix of class "dgCMatrix"
[1,] 1 . . . 1 . . . 1 . . .
[2,] . 1 . . . 1 . . . 1 . .
[3,] . . 1 . . . 1 . . . 1 .
[4,] . . . 1 . . . 1 . . . 1
看到您还使用非稀疏数据(即不是 zeros/ones)并且存在内存问题,您可能需要查看 bigmemory
包。使用这些对象,您可以使用文件备份并拥有比可用内存更大的对象。
编辑
在与 bigmemory
维护者交谈后,我了解到您可以为 Windows 安装它。它不在 CRAN 上,因为 BH
包(它依赖于它)从 C++ boost 库生成警告。要在 Windows 上安装它,您需要安装 Rtools,然后从 github 存储库安装。
devtools::install_github("kaneplusplus/bigmemory")