scipy.linalg.

ldl#

scipy.linalg.ldl(A, lower=True, hermitian=True, overwrite_a=False, check_finite=True)[源代码]#

计算对称/埃尔米特矩阵的 LDLt 或 Bunch-Kaufman 分解。

此函数返回一个块对角矩阵 D,该矩阵由最多 2x2 大小的块组成,以及一个可能经过置换的单位下三角矩阵 L,使得分解式 A = L D L^HA = L D L^T 成立。如果 lower 为 False,则返回(同样可能经过置换的)上三角矩阵作为外部因子。

可以使用置换数组通过简单的行洗牌来三角化外部因子,即 lu[perm, :] 是上/下三角矩阵。这也等效于与置换矩阵 P.dot(lu) 相乘,其中 P 是列置换的单位矩阵 I[:, perm]

根据布尔值 lower 的值,仅引用输入数组的上或下三角部分。因此,输入的三角矩阵会给出与提供完整矩阵相同的结果。

参数:
Aarray_like

方形输入数组

lowerbool,可选

这会在分解的下三角和上三角外部因子之间切换。下三角 (lower=True) 为默认值。

hermitianbool,可选

对于复数值数组,这定义了假设 A = A.conj().T 还是 A = A.T。对于实数值数组,此开关无效。

overwrite_abool,可选

允许覆盖 A 中的数据(可能会提高性能)。默认值为 False。

check_finitebool,可选

是否检查输入矩阵是否仅包含有限数字。禁用可能会提高性能,但如果输入确实包含无穷大或 NaN,则可能会导致问题(崩溃、无法终止)。

返回:
lundarray

分解的(可能)经过置换的上/下三角外部因子。

dndarray

分解的块对角乘数。

permndarray

使 lu 成为三角形形式的行置换索引数组。

引发:
ValueError

如果输入数组不是方形的。

ComplexWarning

如果给定一个对角线上具有非零虚部的复数值数组,并且将 hermitian 设置为 True。

另请参见

cholesky, lu

说明

此函数对对称矩阵使用 ?SYTRF 例程,对埃尔米特矩阵使用 LAPACK 中的 ?HETRF 例程。有关算法详细信息,请参见 [1]

根据 lower 关键字值,仅引用输入数组的下或上三角部分。此外,此关键字还定义分解的外部因子的结构。

在 1.1.0 版本中添加。

参考文献

[1]

J.R. Bunch, L. Kaufman, Some stable methods for calculating inertia and solving symmetric linear systems, Math. Comput. Vol.31, 1977. DOI:10.2307/2005787

示例

给定一个上三角数组 a,它表示具有其条目的完整对称数组,获取 l、‘d’ 和置换向量 perm

>>> import numpy as np
>>> from scipy.linalg import ldl
>>> a = np.array([[2, -1, 3], [0, 2, 0], [0, 0, 1]])
>>> lu, d, perm = ldl(a, lower=0) # Use the upper part
>>> lu
array([[ 0. ,  0. ,  1. ],
       [ 0. ,  1. , -0.5],
       [ 1. ,  1. ,  1.5]])
>>> d
array([[-5. ,  0. ,  0. ],
       [ 0. ,  1.5,  0. ],
       [ 0. ,  0. ,  2. ]])
>>> perm
array([2, 1, 0])
>>> lu[perm, :]
array([[ 1. ,  1. ,  1.5],
       [ 0. ,  1. , -0.5],
       [ 0. ,  0. ,  1. ]])
>>> lu.dot(d).dot(lu.T)
array([[ 2., -1.,  3.],
       [-1.,  2.,  0.],
       [ 3.,  0.,  1.]])