【问题标题】:R Large Matrix Size differencesR 大矩阵尺寸差异
【发布时间】:2013-07-18 04:21:22
【问题描述】:

我有一个很大的相关矩阵,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() 结果:矩阵数组结构向量

【问题讨论】:

  • 是否有可能某些矩阵 mult 算法是“智能的”,因为它们检测到整个列/行何时为 0,这可能会节省相当多的循环?
  • 为什么不使用sparse.matrix 看看有什么不同?
  • 这些必须是稀疏矩阵(正如您的 is() 结果所表明的那样,并且您不可能使用密集矩阵来做到这一点)。因此,这并不特别令人惊讶。这是一个相当难的问题!我不知道减少填充排列是否简单——但这只有在你要对许多具有相同结构的矩阵进行乘法运算时才会有所帮助。另一种可能性是尝试进行并行计算——我不知道是否有一个简单的 BLAS 接口用于稀疏、并行二进制矩阵乘法......

标签: r performance matrix


【解决方案1】:

这是一个可重现的示例,它可能有助于解决来自包 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-13
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多