【问题标题】:Memory-efficient way to build giant block identity matrices?构建巨型块身份矩阵的内存有效方法?
【发布时间】:2015-04-18 11:04:22
【问题描述】:

在 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 多岁,所以在不使用 for 循环中的这些替换的情况下“从头开始”生成矩阵将是首选,因为我遇到了内存阻塞。我尝试查看Matrix 包中的bdiag(),但该功能并不是我想要的。

那么有没有一个函数可以“从头开始”执行此操作?

编辑:

用户很友好地建议我研究“稀疏矩阵”。我遇到了SparseM 包,我 99% 都在那里。我只需使用as.matrix.csr 函数将我的矩阵转换为CSR 格式,再加上cbind.matrix.csrrbind.matrix.csr,我可以有效地获得我需要的所有矩阵。现在的问题是,当我尝试在线性规划求解器 (Rsymphony) 中使用它时,我必须使用 as.matrix() 将 CSR 矩阵转换回正常状态,但它仍然给我一个内存问题。

【问题讨论】:

  • 你看过谷歌搜索结果中的“存储稀疏矩阵”吗?

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


【解决方案1】:

正如@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 包。使用这些对象,您可以使用文件备份并拥有大于可用内存的对象。

编辑

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

devtools::install_github("kaneplusplus/bigmemory")

【讨论】:

  • 感谢您的指导。我尝试使用这种方法,然后当我想将它列绑定到另一个矩阵(全为零)时遇到问题,并且我需要将它绑定到其他非零矩阵。
  • windows 可以使用 bigmemory 吗?我正在查看它的 CRAN 页面,它说 Windows 二进制文件不可用。 'bigmemory.sri' 可用是一样的吗?
  • 啊,真不幸。是的,它目前仅适用于 Linux。我目前不确定这背后的原因是什么。除非其他人介入,否则我需要考虑其他一些节省内存的方法。
  • @gtnbz2nite,请参阅我关于如何在 Windows 上获取 bigmemory 的编辑。让我知道结果如何:)
  • 非常感谢您付出的额外努力!我会回复你的
猜你喜欢
  • 2019-04-01
  • 2017-09-02
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2015-12-22
相关资源
最近更新 更多