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, optional
此参数在分解的下三角和上三角外部因子之间切换。下三角 (
lower=True
) 是默认值。- hermitianbool, optional
对于复数值数组,这定义了是假设
A = A.conj().T
还是A = A.T
。对于实数值数组,此开关无效。- overwrite_abool, optional
允许覆盖 A 中的数据(可能会提高性能)。默认值为 False。
- check_finitebool, optional
是否检查输入矩阵仅包含有限数。禁用此功能可能会带来性能提升,但如果输入确实包含无穷大或 NaN,则可能会导致问题(崩溃、不终止)。
- 返回:
- lundarray
分解的(可能经过置换的)上/下三角外部因子。
- dndarray
分解的块对角乘数。
- permndarray
将 lu 转换为三角形式的行置换索引数组。
- 引发:
- ValueError
如果输入数组不是方阵。
- ComplexWarning
如果给定一个对角线有非零虚部的复数值数组且 hermitian 设置为 True。
备注
此函数对对称矩阵使用 LAPACK 中的
?SYTRF
例程,对埃尔米特矩阵使用?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.]])