2016-08-24 236 views
2

假設我有一個對稱的正半定矩陣A(numpy數組)的「LDL^T」分解,並且我想將所有因子相乘得到A 。LDL的Numpy陣列乘法對稱矩陣的分解乘法

什麼是最有效的方法來實現這一目標?

目前,我正在做的(D可作爲「矢量」): np.dot(np.dot(L, np.diag(D)), L.T), 這顯然是一個不好的解決方案。

+0

@Divakar當然,已經遲到了^^。 – NoBackingDown

+0

請注意,LDL^T在對角線 – percusse

回答

2

方法#1

我們可以使用elementwise multiplication,然後matrix-multiplication。這基本上取代np.dot(L, np.diag(D))與直接element-wise multiplication希望有些加速。所以,有了它,執行將成爲 -

(L*D).dot(L.T) 

方法2

另一種方法可能是用np.einsum做所有這些事情在一走,像這樣 -

np.einsum('ij,j,kj->ik',L,D,L) 

運行時間測試

In [303]: L = np.random.randint(0,9,(1000,1000)) 

In [304]: D = np.random.randint(0,9,(1000)) 

In [305]: %timeit np.dot(np.dot(L, np.diag(D)), L.T) 
1 loops, best of 3: 3.87 s per loop 

In [306]: %timeit (L*D).dot(L.T) 
1 loops, best of 3: 1.39 s per loop 

In [307]: %timeit np.einsum('ij,j,kj->ik',L,D,L) 
1 loops, best of 3: 1.71 s per loop 
+0

上並不一定有1x1塊。我認爲方法#1最快(快速檢查了一些時間點,但沒有正式的基準測試)。我認爲元素明智地指的是真正的元素,而不是每個列乘以右手矢量中的相應元素。 – NoBackingDown

+0

感謝您的基準測試。我認爲相對錶現將取決於維度,第二種方法與第一種方法相比會越來越有利。 – NoBackingDown

+0

@Dominik我很難選擇,因爲應用程序#1確實是matrix-mult,這個問題實質上是基於它。儘管應用#1的負面影響是創建應用#2閃耀的中間陣列。我猜想在更大的陣列中,考慮到內存效率,'einsum'可能會更好。 – Divakar