Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:大整数矩阵_R_Memory_Matrix - Fatal编程技术网

R:大整数矩阵

R:大整数矩阵,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一起使用,并且不需要额外的库。有几个稀疏矩阵包,,…),但我怀疑任何一个都不能像您在这里所需要的那样进行按位表示,甚至是单字

我有一些大的整数矩阵(1000 x 1000000),我必须乘它们并在上面执行rowmax

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

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

我已经看过SparseMatrix,但似乎无法将默认值设置为1而不是0

我如何以一种内存高效的方式表示这些矩阵,但我仍然可以将它们作为矩阵相乘并使用rowmax


它最好能与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
}