我有一个很大的相关矩阵,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分钟
Edit2:执行is()导致:Matrix Array Structure Vector
答案 0 :(得分: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