2026a

# cholesky


Cholesky 分解

函数库: TyMath

# 语法

F=cholesky(A, Val(false); check = true)

F=cholesky(A, Val(true); tol = 0.0, check = true)

F=cholesky(S; shift = 0.0, check = true, perm = nothing)

# 说明

F=cholesky(A, Val(false); check = true) 计算稠密对称正定矩阵 A 的 Cholesky 分解并返回 Cholesky 分解。

矩阵 A 可以是对称或 Hermitian StridedMatrix 或完全对称或 Hermitian StridedMatrix。

三角 Cholesky 因子可以通过 F.L 和 F.U 从因式分解 F 中获得,其中 A ≈ F.U' * F.U ≈ F.L * F.L'。

以下函数可用于 Cholesky 对象:size、\、inv、det、logdet 和 isposdef。

如果您的矩阵 A 由于其构造中的舍入误差而略微非 Hermitian,请在将其传递给 cholesky 之前将其包装在 Hermitian(A) 中,以便将其视为完美的 Hermitian。

当 check = true 时,如果分解失败则抛出错误。当 check = false 时,检查分解有效性的责任在于用户。


F=cholesky(A, Val(true); tol = 0.0, check = true) 计算密集对称半正定矩阵 A 的主元 Cholesky 分解并返回 CholeskyPivoted 分解。

矩阵 A 可以是对称或 Hermitian StridedMatrix 或完全对称或 Hermitian StridedMatrix。

三角 Cholesky 因子可以通过 F.L 和 F.U 从因式分解 F 以及通过 F.p 的排列获得,其中 A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr' 其中 Ur = F.U[1:F.rank, :] 和 Lr = F.L[:, 1:F.rank],或者 A ≈ Up' * Up ≈ Lp * Lp' with Up = F.U[1:F.rank, invperm(F.p)] and Lp = F.L[ invperm(F.p),1:F.rank]。

以下函数可用于 CholeskyPivoted 对象:size、\、inv、det 和 rank。

参数 tol 确定用于确定等级的公差。对于负值,公差是机器精度。

如果您的矩阵 A 由于其构造中的舍入误差而略微非 Hermitian,请在将其传递给 cholesky 之前将其包装在 Hermitian(A) 中,以便将其视为完美的 Hermitian。

当 check = true 时,如果分解失败则抛出错误。当 check = false 时,检查分解有效性的责任在于用户。


F=cholesky(S; shift = 0.0, check = true, perm = nothing) 计算稀疏正定矩阵 A 的 Cholesky 分解。

S 必须是 SparseMatrixCSC 或 SparseMatrixCSC 的对称/厄米特视图。 请注意,即使 S 没有类型标签,它仍然必须是对称的或 Hermitian 的。 如果未给出 perm,则使用减少填充的排列。 F = cholesky(A) 最常用于求解包含 F\b 的方程组,但也为 F 定义了方法 diag、det 和 logdet。您还可以使用 F.L 从 F 中提取单个因子。 但是,由于默认情况下启用旋转,因此分解在内部表示为 S == P' * L * L' * P 和置换矩阵 P; 只使用 L 而不考虑 P 会给出错误的答案。 要包括排列的影响,通常最好提取“组合”因子,例如 PtL = F.PtL(相当于 P'* L)和 LtP = F.UP(相当于 L'*P)。

当 check = true 时,如果分解失败则抛出错误。 当 check = false 时,检查分解有效性的责任在于用户。

设置可选的 shift 关键字参数计算 S+shift*I 而不是 S 的因式分解。如果提供了 perm 参数,它应该是 1:size(S,1) 的排列,给出要使用的顺序。

# 示例

用对称正定矩阵求解线性系统

使用 cholesky 分解对称系数矩阵,然后使用 Cholesky 因子求解线性系统。

创建在对角线上为正值的对称矩阵。

using TyMath
A = [1 0 1; 0 2 0; 1 0 3]
A = 3×3 Matrix{Int64}:
 1  0  1
 0  2  0
 1  0  3

计算矩阵的 Cholesky 因子。

R = cholesky(A).U
R = 3×3 UpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.0      1.0
  ⋅   1.41421  0.0
  ⋅    ⋅       1.41421

为方程 的右侧创建一个向量。

b = sum(A,dims=2)

由于 具有 Cholesky 分解,该线性方程变为 。使用反斜杠运算符求解 x。

x = R\(R'\b)
x = 3×1 Matrix{Float64}:
 1.0
 0.9999999999999999
 0.9999999999999999
矩阵的 Cholesky 分解

计算矩阵的上下 Cholesky 分解,并验证结果。

使用 gallery 函数创建一个 6×6 对称正定测试矩阵。

using TyMath
A = TestArrays.lehmer(6);

使用 A 的上三角计算 Cholesky 因子。

R = cholesky(A).U
R = 6×6 UpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.5       0.333333  0.25      0.2       0.166667
  ⋅   0.866025  0.57735   0.433013  0.34641   0.288675
  ⋅    ⋅        0.745356  0.559017  0.447214  0.372678
  ⋅    ⋅         ⋅        0.661438  0.52915   0.440959
  ⋅    ⋅         ⋅         ⋅        0.6       0.5
  ⋅    ⋅         ⋅         ⋅         ⋅        0.552771

验证上三角因子满足 (在舍入误差内)。

norm(R'*R - A)
ans = 2.482534153247273e-16

使用 A 的下三角形计算 Cholesky 因子。

L = cholesky(A).L
L = 6×6 LowerTriangular{Float64, Matrix{Float64}}:
 1.0        ⋅         ⋅         ⋅         ⋅    ⋅
 0.5       0.866025   ⋅         ⋅         ⋅    ⋅
 0.333333  0.57735   0.745356   ⋅         ⋅    ⋅
 0.25      0.433013  0.559017  0.661438   ⋅    ⋅
 0.2       0.34641   0.447214  0.52915   0.6   ⋅
 0.166667  0.288675  0.372678  0.440959  0.5  0.552771

验证下三角因子满足 (在舍入误差内)。

norm(L*L' - A)
ans = 2.482534153247273e-16

# 输入参数

A - 输入矩阵
矩阵

输入矩阵。参数 A 可以使用满存储或稀疏存储,但必须为方阵和对称正定矩阵。

chol 假设 A 是对称实矩阵,或者是 Hermitian 对称复矩阵。

数据类型: Integer | Float64 | Float32 | Float16

复数支持: 是

S - 稀疏输入矩阵
矩阵

稀疏输入矩阵。S 必须为方阵和对称正定矩阵。

chol 假设 S 是对称实矩阵,或者是 Hermitian 对称复矩阵。

数据类型: Integer | Float64 | Float32 | Float16

复数支持: 是

# 输出参数

F - 输出结果

输出结果。F.L 为下三角矩阵,F.U为上三角矩阵。

数据类型: Integer | Float64 | Float32 | Float16

# 详细信息

对称正定矩阵

对称正定矩阵是所有特征值均为正值的对称矩阵。

对于任何可逆实矩阵 A,您可以用乘积 B = A'* A 构造一个对称正定矩阵。由于任何对称正定矩阵 B 都可以分解为乘积 R'*R,Cholesky 分解可对此公式求反。

对称半正定矩阵的定义与此类似,只是其特征值必须均为正值或零。

在数值计算中,正定矩阵和半正定矩阵之间的界限比较模糊。特征值精确等于零的情况很少见,但它们可以在数值上为零。因此,cholesky 可能能够分解一个半正定矩阵,但对于特征值非常相似的另一个矩阵,分解可能会失败。

# 参考文献

[1] Anderson, E., ed. LAPACK Users’ Guide. 3rd ed. Software, Environments, Tools. Philadelphia: Society for Industrial and Applied Mathematics, 1999. https://doi.org/10.1137/1.9780898719604.

[2] Chen, Yanqing, Timothy A. Davis, William W. Hager, and Sivasankaran Rajamanickam. “Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate.” ACM Transactions on Mathematical Software 35, no. 3 (October 2008): 1–14. https://doi.org/10.1145/1391989.1391995.

# 另请参阅

cholupdate