2012-08-02 114 views
0

我有兩個大的平方稀疏矩陣A & B,需要以最有效的方式計算以下內容:A * B^-1。我有一種感覺,答案涉及使用scipy.sparse,但不能爲我的生活弄清楚。稀疏矩陣乘法涉及倒數矩陣

經過廣泛的搜索後,我遇到了以下線程:Efficient numpy/lapack routine for product of inverse and sparse matrix?,但無法弄清楚最有效的方法是什麼。

有人建議使用內置於scipy稀疏模塊中的LU分解,但是當我嘗試在樣本矩陣上做LU時,結果是奇異的(儘管當我只做一個* B^-1時,我得到一個回答)。我也聽到有人建議使用linalg.spsolve(),但我不知道如何實現這一點,因爲它需要一個向量作爲第二個參數。

如果有幫助,一旦我有解決方案s.t. A * B^-1 = C,我只需要知道矩陣C的一行的值。矩陣大概是1000x1000到1500x1500。

+0

這些矩陣有多大? – irrelephant 2012-08-02 04:06:55

回答

1

其實1000x1000矩陣並不那麼大。您可以在現代桌面計算機上使用numpy.linalg.inv(B)在不到1秒的時間內計算這種矩陣的逆。

但是如果你考慮到你只需要一行C的事實(這實際上很常見),你可以更有效地重寫你的問題。我們寫d_i = [0 0 0 ... 0 1 0 ... 0],這是一個在第i個元素上只有一個的向量。 你可以寫,如果^ T表示轉:

AB^-1 = C <=> A = CB <=> A^t = B^t C^t 

對於第i行:

A^t d_i = B^t C^t d_i <=> a_i = B^t c_i 

所以你可以使用numpy.linalg.solve解決的線性逆問題

ci = np.linalg.solve(B.T, a[i]) 
+0

謝謝!我會試試這個,讓你知道它是怎麼回事。另外,我知道不需要很長時間來進行反演,但是我將不得不做這個過程數萬次,所以我想盡可能地微調它:) – user1554752 2012-08-02 14:22:18

+0

我試過了,之後有點抓撓我的頭,我得到它的工作。你的解決方案在使用'numpy.linalg.solve()'的時候起作用,但是當使用'sparse.linalg.spsolve'時我得到了一個不正確的答案。我的陣列中有以下幾項:'BT = [[0.802,-0.396,0。],[-0.594,0.604,0。],[-0.198,-0.198,0.01]]和AT:[[.25, 。.5,0],[75,.5,0],[0,.0,1]]'。。第二行的正確答案是'[2.00654938,2.80114293,95.19230769]',但是spuffve吐出'[.5,.5,.0]' – user1554752 2012-08-02 21:46:51

+0

好吧。我認爲spsolve的工作方式與解決問題的方法相同,但顯然並非如此。但實際上我不確定從現在的位置開始,使用稀疏矩陣將使您獲得更快的速度。主要優勢是內存消耗,但是你可能不會受限於此,對吧? – 2012-08-03 08:39:22