Numpy数组乘法LDL ^ T对称矩阵分解

时间:2016-08-24 21:26:16

标签: python performance numpy

假设我有一个" LDL ^ T"对称的正半定矩阵A(numpy数组)的分解,我想将所有因子相乘得到A。

实现这一目标的最有效方法是什么?

目前,我正在做(D可用作" vector"):     np.dot(np.dot(L, np.diag(D)), L.T), 这显然是一个糟糕的解决方案。

1 个答案:

答案 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