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

use*_*897 6 python numpy linear-algebra

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

Pra*_*een 10

Scipy有LU分解功能:scipy.linalg.lu.注意,这也在P混合中引入了置换矩阵.这个答案很好地解释了为什么会发生这种情况.

如果您特别需要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.]])
Run Code Online (Sandbox Code Playgroud)

  • 这看起来是最好的可用内置函数,但令人失望的是,它为输入提供了一个非同一性置换矩阵,该矩阵看起来可以在没有一个的情况下进行 LU 分解。 (3认同)