2026a

# 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,则该方阵为埃尔米特矩阵;

    就矩阵元素而言,

  • 埃尔米特矩阵的对角线上的项始终为实数。因为实矩阵不受复共轭影响,所以对称实矩阵也是埃尔米特矩阵。例如,此矩阵既是对称矩阵,也是埃尔米特矩阵;

  • 埃尔米特矩阵的特征值是实数。

# 另请参阅

cholesky | lu | qr