2012-06-25 105 views
2

作爲數值計算的Python代碼的一部分,我必須多次反轉大的(稀疏)矩陣(〜100x100)。我真的很想加快程序的速度,我建議的一種方式是調用C中的子程序進行矩陣反轉步驟。良好的矩陣求逆程序C

是否有任何推薦的有效且經過充分測試的C例程用於此任務?

謝謝。

+2

你看的NumPy的+ SciPy的模塊? – adelbertc

+0

是的,NumPy實際上是我現在正在使用的,每個數據點需要大約5秒才能完成,考慮到我需要大量的點數,這太慢了。我已經讀過NumPy已經被認爲相當高效了,但是從像C這樣的編譯語言中調用一些東西可以節省我很多時間嗎?感謝您的評論! – AKC

+1

NumPy和SciPy都有很多用C和/或FORTRAN編寫的時間關鍵循環 - 沒有太多與C自己編寫Python接口的經驗,我不確定你自己寫了多少改進 - 矩陣反演往往是一個昂貴的計算。這就是說,一種流行的矩陣求逆算法似乎是高斯消去法。 – adelbertc

回答

2
>>> from numpy import * 
>>> from numpy.linalg import inv 
>>> from scipy.sparse import csr_matrix 
>>> m = matrix([[3,1,5],[1,0,8],[2,1,4]]) 
>>> s = csr_matrix(m) 
>>> invs = inv(a) # Inverse sparse matrix 
>>> dot(a,inva) # Check the result, should be eye(3) within machine precision 
csr_matrix([[ 1.00000000e-00, 2.77555756e-17, 3.60822483e-16], 
      [ 0.00000000e+00, 1.00000000e+00, 0.00000000e+00], 
      [ -1.11022302e-16, 0.00000000e+00, 1.00000000e+00]]) 

它真的是你需要的反面嗎?您可以實現自己的目標,而不反轉:

案例,你真的需要逆是罕見的。此外,稀疏矩陣的逆不一定是稀疏的。通常, 反轉比LU分解更昂貴,並且傾向於舍入誤差。

- http://mail.scipy.org/pipermail/scipy-user/2007-October/013936.html

- >http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.factorized.html#scipy.sparse.linalg.factorized