假設我有一個對稱的正半定矩陣A(numpy
數組)的「LDL^T」分解,並且我想將所有因子相乘得到A 。LDL的Numpy陣列乘法對稱矩陣的分解乘法
什麼是最有效的方法來實現這一目標?
目前,我正在做的(D可作爲「矢量」): np.dot(np.dot(L, np.diag(D)), L.T)
, 這顯然是一個不好的解決方案。
假設我有一個對稱的正半定矩陣A(numpy
數組)的「LDL^T」分解,並且我想將所有因子相乘得到A 。LDL的Numpy陣列乘法對稱矩陣的分解乘法
什麼是最有效的方法來實現這一目標?
目前,我正在做的(D可作爲「矢量」): np.dot(np.dot(L, np.diag(D)), L.T)
, 這顯然是一個不好的解決方案。
方法#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
上並不一定有1x1塊。我認爲方法#1最快(快速檢查了一些時間點,但沒有正式的基準測試)。我認爲元素明智地指的是真正的元素,而不是每個列乘以右手矢量中的相應元素。 – NoBackingDown
感謝您的基準測試。我認爲相對錶現將取決於維度,第二種方法與第一種方法相比會越來越有利。 – NoBackingDown
@Dominik我很難選擇,因爲應用程序#1確實是matrix-mult,這個問題實質上是基於它。儘管應用#1的負面影響是創建應用#2閃耀的中間陣列。我猜想在更大的陣列中,考慮到內存效率,'einsum'可能會更好。 – Divakar
@Divakar當然,已經遲到了^^。 – NoBackingDown
請注意,LDL^T在對角線 – percusse