构建巨型块标识矩阵的内存有效方法?

时间:2015-02-17 16:58:10

标签: r for-loop memory matrix sparse-matrix

在R中,我试图使用下面的代码将几个单位矩阵行绑定到一个巨型矩阵中:

>     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是在20s,所以从头开始生成矩阵而不在for循环中使用这些替换将是首选,因为我得到了内存堵塞。我尝试在bdiag()包中查看Matrix,但该功能并不完全符合我的要求。

那么有一个功能可以“从头开始”吗?

修改

用户非常友好地建议我查看'稀疏矩阵'。我遇到SparseM包裹,99%在那里。我只需使用as.matrix.csr函数将我的矩阵转换为CSR格式,并与cbind.matrix.csrrbind.matrix.csr一起使用,我可以有效地获取所需的所有矩阵。现在问题是当我尝试在线性编程求解器(Rsymphony)中使用它时,我必须使用as.matrix()将CSR矩阵转换回正常状态,它仍然会给我一个内存问题。

1 个答案:

答案 0 :(得分:2)

正如@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

如果您正在使用非稀疏数据(即非零/ 1)并且存在内存问题,您可能需要查看bigmemory包。使用这些对象,您可以使用文件备份并使对象大于可用内存。

修改

在与bigmemory维护者交谈后,我了解到您可以为Windows安装它。它不在CRAN上,因为BH包(它依赖于它)会从C ++ boost库生成警告。要在Windows上安装它,您需要安装Rtools,然后从github repo安装。

devtools::install_github("kaneplusplus/bigmemory")