ldl#
- scipy.linalg.ldl(A, lower=True, hermitian=True, overwrite_a=False, check_finite=True)[源代码]#
计算对称/厄米矩阵的 LDLt 分解或 Bunch-Kaufman 分解。
此函数返回一个由至多 2x2 大小的块组成的对角线块矩阵 D,还返回一个可能已置换的单位下三角矩阵
L
,使得分解A = L D L^H
或A = L D L^T
成立。如果 lower 为 False,则会再次返回(可能置换的)上三角矩阵作为外部因子。排列数组可以通过行改组将外因数三角化,即
lu[perm, :]
是一个上/下三角矩阵。这还等同于使用置换矩阵P.dot(lu)
进行乘法,其中P
是列置换恒等矩阵I[:, perm]
。根据布尔值 lower 的值,仅引用输入数组的上或下三角部分。因此,入口处的三角矩阵将产生与提供完整矩阵相同的结果。
- 参数:
- A类似数组
方形输入数组
- lower布尔,可选
此参数可在因式分解的下三角或上三角外因数间切换。下三角(
lower=True
)是默认值。- hermitian布尔,可选
针对复值数组,此参数定义了假设为
A = A.conj().T
还是A = A.T
。此开关对实值数组无效。- overwrite_a布尔,可选
允许覆盖 A 中的数据(可能会提升性能)。默认值为 False。
- check_finite布尔,可选
用以检查输入矩阵是否仅包含有限数字。禁用此项可能会提升性能,但如果输入包含无穷大或 NaN,则可能会导致问题(崩溃、未终止)。
- 返回值:
- lundarray
因式分解的(可能被置换的)上/下三角外因数。
- dndarray
因式分解的块对角乘数。
- permndarray
将 lu 变为三角形的行置换索引数组。
- 引发:
- ValueError
如果输入数组不是方形。
- ComplexWarning
如果给定的是对角线存在非零虚部的复值数组,且 hermitian 被设置为 True。
注释
此函数对对称矩阵使用
?SYTRF
例程,对厄米矩阵使用 LAPACK 中的?HETRF
例程。有关算法详细信息,请参阅 [1]。根据 lower 关键字值,仅引用输入数组的较低或较高三角形部分。此外,此关键字还定义因子分解的外部因子的结构。
在版本 1.1.0 中新增。
参考
[1]J.R. Bunch、L. Kaufman,用于计算惯性和求解对称线性系统的某些稳定方法,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.]])