Numpy中是否有内置/简易的LDU分解方法?

时间:2017-08-02 01:46:47

标签: python numpy linear-algebra

我在numpy.linalg.cholesky中看到cholesky分解,但找不到LDU分解。任何人都可以建议使用功能吗?

2 个答案:

答案 0 :(得分:8)

Scipy有一个LU分解函数:scipy.linalg.lu。请注意,这也会在混合中引入置换矩阵PThis answer给出了为什么会发生这种情况的一个很好的解释。

如果您特别需要LDU,那么您可以将U矩阵标准化以提取D

以下是如何做到的:

>>> import numpy as np
>>> import scipy.linalg as la
>>> a = np.array([[2, 4, 5],
                  [1, 3, 2],
                  [4, 2, 1]])
>>> (P, L, U) = la.lu(a)
>>> P
array([[ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.]])
>>> L
array([[ 1.        ,  0.        ,  0.        ],
       [ 0.5       ,  1.        ,  0.        ],
       [ 0.25      ,  0.83333333,  1.        ]])
>>> U
array([[ 4. ,  2. ,  1. ],
       [ 0. ,  3. ,  4.5],
       [ 0. ,  0. , -2. ]])
>>> D = np.diag(np.diag(U))   # D is just the diagonal of U
>>> U /= np.diag(U)[:, None]  # Normalize rows of U
>>> P.dot(L.dot(D.dot(U)))    # Check
array([[ 2.,  4.,  5.],
       [ 1.,  3.,  2.],
       [ 4.,  2.,  1.]])

答案 1 :(得分:0)

尝试一下:

import numpy as np

A = np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]])
U = np.triu(A,1)
L = np.tril(A,-1)
D = np.tril(np.triu(A))
print(A)
print(L)
print(D)
print(U)