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^H
或A = 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。
说明
此函数对对称矩阵使用
?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.]])