R:大整数矩阵
我有一些大的整数矩阵(1000 x 1000000),我必须乘它们并在上面执行rowmax 它们包含0和1(大约99%1和1%0,没有其他值) 我的问题是内存消耗:目前R每个整数消耗8个字节 我已经看过SparseMatrix,但似乎无法将默认值设置为1而不是0 我如何以一种内存高效的方式表示这些矩阵,但我仍然可以将它们作为矩阵相乘并使用rowmaxR:大整数矩阵,r,memory,matrix,R,Memory,Matrix,我有一些大的整数矩阵(1000 x 1000000),我必须乘它们并在上面执行rowmax 它们包含0和1(大约99%1和1%0,没有其他值) 我的问题是内存消耗:目前R每个整数消耗8个字节 我已经看过SparseMatrix,但似乎无法将默认值设置为1而不是0 我如何以一种内存高效的方式表示这些矩阵,但我仍然可以将它们作为矩阵相乘并使用rowmax 它最好能与R-2.15一起使用,并且不需要额外的库。有几个稀疏矩阵包,,…),但我怀疑任何一个都不能像您在这里所需要的那样进行按位表示,甚至是单字
它最好能与R-2.15一起使用,并且不需要额外的库。有几个稀疏矩阵包,,…),但我怀疑任何一个都不能像您在这里所需要的那样进行按位表示,甚至是单字符表示。你可能需要自己编写代码
或者,像这样的包允许更紧凑的存储,但AFAIK不会为您提供矩阵运算。也许你可以把它放在它们上面?在我脑子里,我想不出一个打包的解决方案
通过按行运行长度编码,似乎可以非常高效地表示这种类型的数据。从那里,您可以为rle对象(可能很难)和row max(应该很简单)实现矩阵向量乘法方法 由于只有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)
}
pseudo.matrix第二个想法:如果你有两个这样的矩阵,把它们叫做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'-Y_1*1*1'-1*1'-1*1'-Y_2+Y_1*Y_2
你可以进一步简化。你不想更新你的R有什么原因吗?你能重新分配0 1吗?@rawr该程序是为通常无法更新R的外部用户编写的。@Hugh它会使乘法得到错误的结果。此外,如果有人能将其编辑到公式中,我将不胜感激。
recover.matrix <- function(x) {
m <- matrix(1, x$nrow, x$ncol)
for (i in x$zeroes.cells) m[i] <- 0
m
}