如何计算巨大的对角矩阵逆(dim 14000 * 14000)

时间:2014-05-21 21:52:13

标签: r matrix matrix-inverse

如何计算巨大(昏暗的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

3 个答案:

答案 0 :(得分:4)

对于大型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

答案 1 :(得分:1)

首先,一定要使用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

答案 2 :(得分:1)

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

如此简单:

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