r-构建巨型块恒等矩阵的高效内存方法



在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是20多岁,所以最好"从头开始"生成矩阵,而不在for循环中使用这些替换,因为我的内存堵塞了。我试着在Matrix包中查看bdiag(),但该函数并不是我想要的。

那么,有没有一个函数可以"从头开始"做到这一点呢?

编辑:

用户们好心地建议我研究"稀疏矩阵"我偶然发现了SparseM包,99%都在那里。我只需使用as.matrix.csr函数将矩阵转换为CSR格式,再加上cbind.matrix.csrrbind.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

看到您如何使用非稀疏数据(即非零/一)并存在内存问题,您可能需要查看bigmemory包。有了这些对象,您可以使用filebacking,并拥有比可用内存更大的对象。

编辑

在与bigmemory维护人员交谈后,我了解到您可以为Windows安装它。它不在CRAN上,因为BH包(它所依赖的)从C++提升库生成警告。要在Windows上安装它,您需要安装Rtools,然后从github repo进行安装。

devtools::install_github("kaneplusplus/bigmemory")

最新更新