反相

2016-08-17 71 views
-1

我有一個等式反相

組Ax =通過

其中A和B是三對角矩陣三角矩陣。我想計算一個矩陣

C = INV(A).B

有不同的x,S這將給出不同的Y,S,因此計算C是很方便的。

有人可以告訴我一個更快的方法來計算逆。我使用的是Python 3.5,如果我們使用numpy的任何方法,我更喜歡它。如果不可能,我可以使用scipy或cython作爲第二和第三選擇。

我已經看到其他類似的問題,但他們不完全符合我的問題。

謝謝

回答

1

有很多方法去做,反正最簡單的一種是三對角矩陣算法見Wiki page。該算法在O(n)時間內工作,在Numpy中有一個簡單的實現,在以下Github link。 然而,你可能會想自己實現一個已知的算法,例如像LU factorization

+0

謝謝,但這裏的問題是,這個算法會太慢。如你所知,通常的numpy矩陣方法使用英特爾MKL庫或BLAS實現,因此你不能用通常的元素方法來擊敗這些算法。我不能自己實現這樣的實現,但可以利用它們,如果這樣的事情是可用的。 – hsinghal

+0

好的,我明白了。是的,當然BLAS的實現是無與倫比的,但是從scipy/numpy接縫文檔來看,沒有特別的tridiag-mat反轉方法。 –

0

scipy.linalg.solve_banded是LAPACK的包裝,它應該依次調用MKL。它似乎運行O(N)。一個簡單的例子來顯示語法

a = np.array([[1,2,0,0], [-1,2,1,0], [0,1,3,1], [0,0,1,2]]) 
    x = np.array([1,2,3,4]) 
    b = np.dot(a,x) 
    ab = np.empty((3,4)) 
    ab[0,1:] = np.diag(a,1) 
    ab[1,:] = np.diag(a,0) 
    ab[2,:-1] = np.diag(a,-1) 
    y = solve_banded((1,1),ab,b) 
    print y