R大矩阵尺寸差异

3
我有一个大的相关矩阵,大小为62589x62589。我已经将矩阵二值化超过了某个阈值,这一步没有问题,但我对基本计算时间的显著差异感到有些困惑。
第一次进行此操作时......1的数量:425,491 ... 0的数量:3,916,957,430 这两个数字的总和等于62589 ^ 2,表明该矩阵确实被二值化。我将其保存为Rdata对象(31Mb)。执行矩阵的基本计算需要约3.5分钟。
fooB <- foo %*% foo

第二次,阈值更低......1的数量:30,384,683...0的数量:3,886,998,238。这些数字的总和再次是62589^2,因此是真正的二元化。Rdata对象为84Mb。执行与上面相同的乘法步骤仍在一个小时后计算。
最新矩阵中1的增加是否会如此大地增加文件大小和处理时间?
谢谢阅读。
编辑:对于相同的计算到第二个矩阵的最终时间为65分钟。
编辑2:执行is()的结果为:矩阵数组结构向量。

有些矩阵乘法算法是否可能是“智能的”,可以检测整个列/行是否为0,这可以节省相当多的循环,潜在地? - joran
为什么不使用sparse.matrix来查看区别呢? - agstudy
2
这些必须是稀疏矩阵(根据您的is()结果和您不可能使用密集矩阵来完成此操作的事实)。因此,这并不特别令人惊讶。这是一个相当困难的问题!我不知道进行填充减少置换是否很简单,但只有在您要对具有相同结构的多个矩阵进行乘法运算时才有帮助。另一种可能性是尝试进行并行计算-我不知道是否有用于稀疏、并行二进制矩阵乘法的易于使用的BLAS接口... - Ben Bolker
1个回答

0

这里有一个可重现的例子,可能有助于处理来自Matrix包的二进制稀疏矩阵的内存大小和处理时间:

n <- 62589

N1 <- 425491

require(Matrix)

foo <- sparseMatrix(i=sample(n, N1, TRUE), j=sample(n, N1, TRUE), dims=c(n, n))

print(object.size(foo), units="Mb")
#1.9 Mb
sum(foo)
#[1] 425464

请注意,由于抽样可能会产生一些重复的配对(i,j),因此上面的数字稍微小于N1。
平方:
system.time(fooB <- foo %*% foo)
#   user  system elapsed 
#   0.39    0.03    0.42

print(object.size(fooB), units="Mb")
#11.3 Mb
sum(fooB)
#[1] 2892234

立方化:

system.time(fooC <- fooB %*% foo)
#   user  system elapsed 
#   2.74    0.11    2.87 

print(object.size(fooC), units="Mb")
#75 Mb
sum(fooC)
#[1] 19610641

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接