2026a

# cholupdate


Cholesky 分解的秩 1 更新

函数库: TyMath

# 语法

R1 = cholupdate(R,x,update=true)

# 说明

R1 = cholupdate(R,x,update=true)(其中 R = cholesky(A) 是 A 的原始 Cholesky 分解),update 默认为 true。当 update 指定为 true 时,返回 A + x*x' 的上三角 Cholesky 因子,其中 x 是具有合适长度的一个列向量。cholupdate 仅使用 R 的对角线和上三角。R 的下三角将被忽略。如果 update 指定为 false,则返回 A - x*x' 的 Cholesky 因子。示例

# 示例

Cholesky 分解的秩 1 更新
using TyMath
A = pascal(4)
A = 4×4 Matrix{Int64}:
1  1   1   1
1  2   3   4
1  3   6  10
1  4  10  20
R = cholesky(A).U
x = [0,0,0,1]
R = 4×4 UpperTriangular{Float64, Matrix{Float64}}:
1.0  1.0    1.0  1.0
⋅    1.0    2.0  3.0
⋅    ⋅       1.0  3.0
⋅    ⋅        ⋅   1.0

x = 4-element Vector{Int64}:
0
0
0
1

这称为对 A 的秩为一的更新,因为 rank(x*x') 为 1:

A + x*x'
ans = 4×4 Matrix{Int64}:
1  1   1   1
1  2   3   4
1  3   6  10
1  4  10  21

不使用 R1 = cholesky(A + x*x') 计算 Cholesky 因子,可以使用 cholupdate:

R1 = cholupdate(R,x)
R1 = 4×4 UpperTriangular{Float64, Matrix{Float64}}:
1.0     1.0     1.0     1.0
⋅       1.0     2.0     3.0
⋅       ⋅       1.0     3.0
⋅       ⋅        ⋅      1.41421

接下来,通过从 A 的最后一个元素中减去 1 来破坏正定性(并且实际上将矩阵设置为奇异矩阵)。旧矩阵为:

A - x*x'
ans = 4×4 Matrix{Int64}:
1  1   1   1
1  2   3   4
1  3   6  10
1  4  10  19

将 cholesky 与 cholupdate 进行比较:

R1 = cholesky(A-x*x')
PosDefException: matrix is not positive definite; Cholesky factorization failed.
R1 = cholupdate(R,x,false)
ans = 4×4 UpperTriangular{Float64, Matrix{Float64}}:

 1.0  1.0  1.0  1.0
  ⋅   1.0  2.0  3.0
  ⋅    ⋅   1.0  3.0
  ⋅    ⋅    ⋅   0.0

但是,将 0.5 从 A 的最后一个元素中减去将生成一个正定矩阵,可以使用 cholupdate 计算其 Cholesky 因子:

x = [0,0,0,1/sqrt(2)]
R1 = cholupdate(R,x,false)
R1 = 4×4 UpperTriangular{Float64, Matrix{Float64}}:
1.0     1.0     1.0     1.0
⋅       1.0     2.0     3.0
⋅       ⋅       1.0     3.0
⋅       ⋅       ⋅       0.707107

# 提示

cholupdate 仅适用于满秩矩阵。

# 另请参阅

qrupdate | qrinsert