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