2014-05-21 67 views
0

如何計算巨大(dim 14000 * 14000)矩陣的逆? 我試圖與R和一個錯誤信息已經被示出爲:如何計算大對角矩陣逆(dim 14000 * 14000)

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 
+1

還要注意的是對角線'M'那簡直是'1/M'。 – Julius

+2

如果你的矩陣不是*稀疏的,這將是不可能的(或者至少非常非常非常困難)。根據你想要做什麼,通常有計算捷徑來解決實際上不需要反轉矩陣的問題(例如求解線性系統,計算特徵值等) –

回答

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 
1

首先,一定要使用R的64位版本,一臺機器的RAM普朗蒂。儘管矩陣求逆是一個需要O(n^3)算術運算的計算複雜操作,但對於n = 10000甚至n = 16000來說,這是遠遠不可能的。在我不是非常現代的PC上,運行帶有Intel®Math Kernel Library(Revolution 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 
0

這是基本的代數:如果您X矩陣的確是對角線,逆Y是對角矩陣,其對角線元素Y_{i,i} = 1/X_{i,i}

所以,簡單地做:

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