【问题标题】:How to compute huge diagonal matrix inverse (dim 14000*14000)如何计算巨大的对角矩阵逆(dim 14000*14000)
【发布时间】:2014-07-10 18:17:10
【问题描述】:

如何计算一个巨大的 (dim 14000*14000) 矩阵的逆矩阵? 我正在尝试使用 R 并且错误消息显示为:

Error: cannot allocate vector of size 762.9 Mb

我知道这表示获取内存失败。 任何帮助将不胜感激。

即使我尝试反转标量单位矩阵,R 也无法解决它。标量单位矩阵的逆将是同一个矩阵,但R也不能解决它。

> solve(diag(1,10000,10000))
Error: cannot allocate vector of size 762.9 Mb

【问题讨论】:

  • 另请注意,对于对角线m,它只是1 / m
  • 如果您的矩阵不是稀疏的,这将是不可能的(或者至少非常、非常、非常困难)。根据您要执行的操作,通常有一些计算捷径可以解决实际上不需要反转矩阵的问题(例如求解线性系统、计算特征值等)

标签: r matrix matrix-inverse


【解决方案1】:

这是基本代数:如果您的X 矩阵确实是对角矩阵,则逆矩阵Y 是一个对角矩阵,其对角元素是Y_{i,i} = 1/X_{i,i}

所以简单地做:

x = diag(rnorm(14E3))
inv = diag(1/diag(x))

【讨论】:

    【解决方案2】:

    首先,请务必使用 64 位版本的 R 和具有大量 RAM 的机器。

    虽然矩阵求逆是一项计算复杂的运算,需要 O(n^3) 次算术运算,但对于 n = 10000 甚至 n = 16000,这远非不可能。在我不太现代的 PC 上,使用英特尔® 数学内核运行 R图书馆(革命 R)我观察到以下内容。

    对于 n = 10000,它在 1.5 分钟内运行并使用 3.2 GB 的 RAM:

    system.time({
      z = solve(diag(1,10000,10000))
    });
    
      user  system elapsed 
    341.89    0.63   87.22 
    

    对于 n = 16000,它在 6 分钟内完成并使用 8GB 的​​ RAM。

    system.time({
      z = solve(diag(1,16000,16000))
    });
    
       user  system elapsed 
    1388.80    2.34  353.95
    

    【讨论】:

      【解决方案3】:

      对于较大的sparse matrices,请使用Matrix package

      library(Matrix)
      
      ## Construct a memory-efficient representation of a large, sparse, diagonal matrix
      dmat <- Diagonal(x=1:14000)
      
      ## Finding the inverse is fast and painless
      system.time(dmat.inv <- solve(dmat))
      #   user  system elapsed 
      #      0       0       0 
      
      ## Check  that it worked
      dmat.inv[c(1:3, 13998:14000), c(1:3, 13998:14000)]
      # 6 x 6 diagonal matrix of class "ddiMatrix"
      #      [,1] [,2] [,3]      [,4]         [,5]         [,6]        
      # [1,]    1    .         .            .            .            .
      # [2,]    .  0.5         .            .            .            .
      # [3,]    .    . 0.3333333            .            .            .
      # [4,]    .    .         . 7.143878e-05            .            .
      # [5,]    .    .         .            . 7.143367e-05            .
      # [6,]    .    .         .            .            . 7.142857e-05
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多