假设我有一个" LDL ^ T"对称的正半定矩阵A(numpy
数组)的分解,我想将所有因子相乘得到A。
实现这一目标的最有效方法是什么?
目前,我正在做(D可用作" vector"):
np.dot(np.dot(L, np.diag(D)), L.T)
,
这显然是一个糟糕的解决方案。
答案 0 :(得分: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