【问题标题】:R: Big integer matricesR:大整数矩阵
【发布时间】:2014-03-13 02:11:20
【问题描述】:

我有一些大整数矩阵 (1000 x 1000000) 必须相乘并对其进行 rowmax。

它们包含 0 和 1(大约 99% 1 和 1% 0,没有其他值)。

我的问题是内存消耗:目前 R 每个整数占用 8 个字节。

我查看了 SparseMatrix,但似乎我无法将默认值设置为 1 而不是 0。

我怎样才能以一种节省内存的方式来表示这些矩阵,但我仍然可以将它们作为矩阵相乘并使用 rowmax?

最好它应该与 R-2.15 一起使用,并且不需要额外的库。

【问题讨论】:

  • 有什么原因你不想更新你的 R?
  • 你能重新分配 0 1 吗?
  • @rawr 该程序适用于通常无法更新 R 的外部用户。
  • @Hugh 这会使乘法得到错误的结果。

标签: r memory matrix


【解决方案1】:

第二个想法:如果你有几个这样的矩阵,称它们为 X_1 和 X_2,让 Y_1 = 1*1' - X_1 和 Y_2 = 1*1' - X_2; Y 可能是稀疏的,因为它们 99% 为零。所以他们的产品是

X_1 * X_2 = ( 1*1' - Y_1) * (1*1' - Y_2) = 1*1'*1*1' - Y_1*1*1' - 1*1'*Y_2 + Y_1 * Y_2

您可以进一步简化。

【讨论】:

  • 另外,如果有人可以将其编辑成公式,我将不胜感激。
【解决方案2】:

有几个稀疏矩阵包slamSparseMMatrix,...)但我怀疑任何人都会做按位表示,甚至是单个字符,因为你需要在这里。您可能需要自己编写代码。

另外,像 ff 这样的包允许更紧凑的存储,但 AFAIK 不会为您执行矩阵操作。也许你可以在他们之上?

【讨论】:

    【解决方案3】:

    我想不出一个打包的解决方案...

    您似乎可以通过按行的运行长度编码非常有效地表示这种类型的数据。从那里,您可以为 rle 对象(这可能很难)和 row-max(这应该是微不足道的)实现矩阵向量乘法方法。

    【讨论】:

      【解决方案4】:

      由于只有 1% 的 0,所以压缩起来并不困难。一个简单的例子:

      pseudo.matrix <- function(x){
        nrow <- nrow(x)
        ncol <- ncol(x)
        zeroes.cells <- which(x==0)
        p <- list(nrow=nrow, ncol=ncol, zeroes.cells=zeroes.cells)
      }
      

      仅此一项就可以显着减少它们的内存大小。并且很容易恢复原始矩阵:

      recover.matrix <- function(x) {
        m <- matrix(1, x$nrow, x$ncol)
        for (i in x$zeroes.cells) m[i] <- 0
        m
      }
      

      我想有可能找到一种方法来有效地将这些伪矩阵相乘,因为每个单元格的结果将类似于第一个矩阵的列数减去有关操作中零数的调整,但我不确定这样做有多么容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-04
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多