# ldl
埃尔米特不定矩阵的分块 LDL 分解
函数库: TyMath
# 语法
L,D = ldl(A)
L,D = ldl(A;islower)
L,D,P = ldl(A;isperm)
L,D,P = ldl(A;isvec,isperm)
L,D,P = ldl(S;isperm)
L,D,P = ldl(S;islower,isperm)
L,D,P = ldl(S;isvec,isperm)
# 说明
# 满数据
L,D = ldl(A) 将满矩阵 A 分解为置换的下三角矩阵 L 和满足 A = LDL' 的分块对角矩阵 D。示例
L,D = ldl(A;islower) (其中 islower 是 false)使用 A 的上三角形来计算分解。默认情况下,islower 是 true,它使用 A 的下三角形来计算分解。示例
L,D,P = ldl(A;isperm)(其中 isperm 是 true)还返回满足 P'* A* P = L* D* L' 的置换矩阵。默认情况下,isperm 是 false。您可以使用上述语法中的任何输入参量组合。示例
L,D,P = ldl(A;isvec,isperm) 以 isvec 指定的形式返回置换信息。将 isvec 指定为 true,默认是 false。以向量形式返回置换信息。示例
# 稀疏数据
L,D,P = ldl(S;isperm)(其中 isperm 是 true )为实稀疏矩阵 S 返回满足 P'* S* P = L* D* L' 的下三角因子、分块对角因子和置换信息。默认情况下,isperm 是 false。示例
L,D,P = ldl(S;islower,isperm)(其中 islower 是 false )使用实稀疏矩阵 S 的上三角形来计算分解。默认情况下,islower 是 true,它使用 S 的下三角形来计算分解。对于稀疏矩阵,您可以使用上述语法中的任何输入和输出参量组合。
L,D,P = ldl(S;isvec,isperm) 以 isvec 指定的形式返回置换信息。将 isvec 指定为 true,默认是 false。以向量形式返回置换信息。
# 示例
矩阵的 LDL 分解
使用具有三个输出参量的 ldl 函数计算 3×3 矩阵的完整 LDL 分解。
using TyMath
A = [2 -1 0
-1 2 -1
0 -1 1]
L1,D1,P1 = ldl(A;isperm=true)
L1 = 3×3 Matrix{Float64}:
1.0 0.0 0.0
-0.5 1.0 0.0
0.0 -0.666667 1.0
D1 = 3×3 Matrix{Float64}:
2.0 0.0 0.0
0.0 1.5 0.0
0.0 0.0 0.333333
P1 = 3×3 Matrix{Int64}:
1 0 0
0 1 0
0 0 1
通过指定两个输出参量,将置换矩阵 P 合并到 L 因子中。此处,L2 等于 P1*L1。
L2,D2 = ldl(A)
L2 = 3×3 Matrix{Float64}:
1.0 0.0 0.0
-0.5 1.0 0.0
0.0 -0.666667 1.0
D2 = 3×3 Matrix{Float64}:
2.0 0.0 0.0
0.0 1.5 0.0
0.0 0.0 0.333333
P1*L1
ans = 3×3 Matrix{Float64}:
1.0 0.0 0.0
-0.5 1.0 0.0
0.0 -0.666667 1.0
用 LDL 分解对线性方程组求解
通过执行 LDL 分解并使用因子来简化问题,对线性系统求解。
创建一个 3×3 矩阵和 3×1 向量,并使用反斜杠运算符求解线性系统 A*x = b。
using TyMath
A = [2 -3 4
-3 2 -3
4 -3 1]
b = [1; 0; 0]
x1 = A\b
x1 = 3-element Vector{Float64}:
-0.411764705882353
-0.5294117647058824
0.05882352941176471
计算 A 的 LDL 分解。使用因子求解系统。由于 P'* A* P = L* D* L',线性系统 A* x = b 可以重写为 inv(P')* L* D* L'* inv(P)* x = b。通过求解 x,线性系统可重写为 x = P* inv(L')* inv(D)* inv(L)* P'* b 或 x = P* (L'(D(L(P'* b))))。
在求解线性系统之前预先计算矩阵因子可以在求解具有几个不同 b 值的线性系统时提高性能,因为分解只发生一次,不需要重复。
L,D,P = ldl(A;isperm=true)
L = 3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
-0.642857 -0.428571 1.0
D = 3×3 Matrix{Float64}:
2.0 4.0 0.0
4.0 1.0 0.0
0.0 0.0 -1.21429
P = 3×3 Matrix{Int64}:
1 0 0
0 0 1
0 1 0
x2 = P*(L'\(D\(L\(P'*b))))
x2 = 3-element Vector{Float64}:
-0.41176470588235303
-0.5294117647058825
0.05882352941176466
用使用上三角形的 LDL 分解
使用 3×3 矩阵的下三角形计算其 LDL 分解。
using TyMath
A =
[2 -1 0
-3 2 -1
0 -3 1]
L,D = ldl(A)
L =
3×3 Matrix{Float64}:
1.0 0.0 0.0
-1.5 1.0 0.0
0.0 1.2 1.0
D =
3×3 Matrix{Float64}:
2.0 0.0 0.0
0.0 -2.5 0.0
0.0 0.0 4.6
通过将 islower 改为 false,使用同一矩阵的上三角形计算其 LDL 分解。
Lu,Du = ldl(A;islower=false)
Lu =
3×3 transpose(::Matrix{Float64}) with eltype Float64:
1.0 -0.5 0.0
0.0 1.0 -0.666667
0.0 0.0 1.0
Du =
3×3 transpose(::Matrix{Float64}) with eltype Float64:
2.0 0.0 0.0
0.0 1.5 0.0
0.0 0.0 0.333333
LDL 分解的置换向量
要分解的矩阵越大,使用置换向量的效率就越高。使用置换向量还可以节省后续操作中的执行时间。
创建一个 1000×1000 对称随机矩阵,并计算矩阵的 LDL 分解。为 ldl 函数指定三个输出参量以返回置换信息。比较存储为矩阵和存储为向量的置换信息的大小。
using TyMath
rng = MT19937ar(5489)
A = rand(rng,1000,1000)
A = A + A'
L,D,P = ldl(A;isperm=true)
Lv,Dv,Pv = ldl(A;isperm=true,isvec=true)
varinfo(r"^P")
name size summary
–––– ––––––––– ––––––––––––––––––––––––––
P 7.629 MiB 1000×1000 Matrix{Int64}
Pv 7.852 KiB 1000-element Vector{Int64}
使用置换矩阵时,因子满足恒等式 P'* A* P = L* D* L'。使用置换向量时,因子满足恒等式 A(v,v) = Lv* Dv* Lv'。
稀疏矩阵的LDL分解
using TyMath
using TyBase
rng=MT19937ar(5489)
A = randn(rng,7,7);
A = A .+ A';
d = logspace(0,-20,7);
A = A.*d.*d';
L,D,P = ldl(sparse(A); isperm=true)
full(D)
ans = 7×7 Matrix{Float64}:
1.07533 0.0 0.0 0.0 0.0 0.0 0.0
0.0 5.92787e-7 0.0 0.0 0.0 0.0 0.0
0.0 0.0 -6.60565e-13 0.0 0.0 0.0 0.0
0.0 0.0 0.0 1.29993e-20 0.0 0.0 0.0
0.0 0.0 0.0 0.0 -6.07618e-27 0.0 0.0
0.0 0.0 0.0 0.0 0.0 2.27675e-34 0.0
0.0 0.0 0.0 0.0 0.0 0.0 -4.66347e-39
使用 P'* S* P 置换 S 的行和列,并将结果与三角因子 L* U 乘积进行比较。二者之差的 1-范数在舍入误差之内,这表明 P'* S* P = L* D* L'
e=P'*A*P-L*D*L'
norm(e,1)
ans = 1.034717479906716e-25
# 输入参数
A - 输入矩阵矩阵
输入矩阵。A 可以是满矩阵或稀疏矩阵,也可以是方阵或矩形矩阵。
数据类型: Float | Int
复数支持: 是
S - 稀疏输入矩阵稀疏矩阵
稀疏输入矩阵。S 可以是方阵或矩形矩阵。
数据类型: Float | Int
复数支持: 是
islower - 输入矩阵的三角因子true(默认) | false
输入矩阵的三角因子,指定为 true 或 false。使用此选项指定 ldl 应使用输入矩阵的下三角形或上三角形来计算分解。ldl 假设输入矩阵是对称矩阵(如果是复矩阵,则为埃尔米特矩阵),并且仅使用下三角形或上三角形来执行计算。 如果指定三个输出参量,并且 islower 是 true,则分解满足 P'* A* P = L* D* L',并且 L 是下三角形。如果 islower 是 false,则分解满足 P'* A* P = L'* D* L,并且 L 是上三角形。
isvec - 置换输出的形状false(默认) | true
置换输出的形状,指定为 true 或 false。如果 isvec 是 false 并且使用下三角形,则置换矩阵满足 P'* A* P = L* D* L'。如果 isvec 是 true 并且使用下三角形,则置换向量满足 A[P,P] = L* D* L'
数据类型: Bool
isperm - 指定是否输出置换信息false(默认) | true
指定 isperm 是 true 或 false,来控制是否输出置换信息。
数据类型: Bool
# 输出参数
L - 下三角因子矩阵
下三角因子,以方阵形式返回。默认情况下,L 是单位下三角矩阵,它是对角线上元素为 1 的下三角矩阵。如果 islower 是 false,则 L 是单位上三角矩阵。
数据类型: Float | Int
D - 分块对角因子矩阵
分块对角因子,以方阵形式返回。D 在其对角线上有 1×1 和 2×2 分块。
数据类型: Float | Int
P - 置换信息矩阵|向量
置换信息,以矩阵形式返回;或者如果 isvec 是 true,则以向量形式返回。
数据类型: Float | Int
# 详细信息
详细信息
如果某个方阵 A = A' 等于其复共轭转置 A,则该方阵为埃尔米特矩阵;
就矩阵元素而言,
埃尔米特矩阵的对角线上的项始终为实数。因为实矩阵不受复共轭影响,所以对称实矩阵也是埃尔米特矩阵。例如,此矩阵既是对称矩阵,也是埃尔米特矩阵;
埃尔米特矩阵的特征值是实数。