我有一些大整数矩阵(1000 x 1000000),我必须乘以并行rowmax。
它们包含0和1(约99%1和1%0,没有其他值)。
我的问题是内存消耗:目前R每个整数占用8个字节。
我看过SparseMatrix,但似乎我无法将默认值设置为1而不是0。
如何以内存有效的方式表示这些矩阵,但是我仍然可以将它们作为矩阵相乘并使用rowmax?
最好它适用于R-2.15,不需要额外的库。
答案 0 :(得分: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
你可以进一步简化。
答案 1 :(得分:0)
有几个稀疏矩阵包slam,SparseM,Matrix,...)但我怀疑任何人都会按照你的需要进行逐位呈现,甚至是单个字符这里。您可能需要自己编写代码。
或者,像ff这样的软件包允许更紧凑的存储,但AFAIK不会为您执行矩阵操作。也许你能在他们之上做到这一点?
答案 2 :(得分:0)
我无法想到一个打包的解决方案......
看起来你可以通过行的行程编码非常有效地表示这种类型的数据。从那里,你可以为rle对象(可能很难)和row-max(应该是微不足道的)实现矩阵向量乘法方法。
答案 3 :(得分:0)
由于只有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
}
我想有可能想出一种有效地乘以这些伪矩阵的方法,因为每个单元的结果将类似于第一个矩阵的列数减去关于操作中零的数量的调整,但我不确定这样做会有多容易。