我有一個等式反相
組Ax =通過
其中A和B是三對角矩陣三角矩陣。我想計算一個矩陣
C = INV(A).B
有不同的x,S這將給出不同的Y,S,因此計算C是很方便的。
有人可以告訴我一個更快的方法來計算逆。我使用的是Python 3.5,如果我們使用numpy的任何方法,我更喜歡它。如果不可能,我可以使用scipy或cython作爲第二和第三選擇。
我已經看到其他類似的問題,但他們不完全符合我的問題。
謝謝
我有一個等式反相
組Ax =通過
其中A和B是三對角矩陣三角矩陣。我想計算一個矩陣
C = INV(A).B
有不同的x,S這將給出不同的Y,S,因此計算C是很方便的。
有人可以告訴我一個更快的方法來計算逆。我使用的是Python 3.5,如果我們使用numpy的任何方法,我更喜歡它。如果不可能,我可以使用scipy或cython作爲第二和第三選擇。
我已經看到其他類似的問題,但他們不完全符合我的問題。
謝謝
有很多方法去做,反正最簡單的一種是三對角矩陣算法見Wiki page。該算法在O(n)時間內工作,在Numpy中有一個簡單的實現,在以下Github link。 然而,你可能會想自己實現一個已知的算法,例如像LU factorization
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
謝謝,但這裏的問題是,這個算法會太慢。如你所知,通常的numpy矩陣方法使用英特爾MKL庫或BLAS實現,因此你不能用通常的元素方法來擊敗這些算法。我不能自己實現這樣的實現,但可以利用它們,如果這樣的事情是可用的。 – hsinghal
好的,我明白了。是的,當然BLAS的實現是無與倫比的,但是從scipy/numpy接縫文檔來看,沒有特別的tridiag-mat反轉方法。 –