# qrupdate
QR 分解的秩 1 更新
函数库: TyMath
# 语法
Q1,R1 = qrupdate(Q,R,u,v)
# 说明
如果 Q,R = qr(A) 是 A 的原始 QR 分解,Q1,R1 = qrupdate(Q,R,u,v) 返回 A + u*v' 的 QR 分解,其中 u 和 v 是相应长度的列向量。
# 示例
QR 分解的秩 1 更新
using TyMath
mu = sqrt(eps())
mu = 1.4901161193847656e-8
A = Matrix([ones(1,4); mu*I(4)]);
是公认的最小平方示例,指明组成 A'*A 的危险。但我们使用 QR 分解 – 正交 Q 和上三角 R。
Q,R = qr(A)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q factor: 5×5 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R factor:
4×4 Matrix{Float64}:
-1.0 -1.0 -1.0 -1.0
0.0 2.10734e-8 1.05367e-8 1.05367e-8
0.0 0.0 1.82501e-8 6.08337e-9
0.0 0.0 0.0 1.72064e-8
在这种情况下,除了第一行,R 的上三角项都与 sqrt(eps) 类似。
请考虑更新向量
u = [-1, 0, 0, 0, 0];
v = ones(4,1);
通过以下项从头更新到 A,而不是计算该秩毫无价值的 QR 分解:
QT,RT = qr(A + u*v')
QT = Matrix(QT)
QT = 5×4 Matrix{Float64}:
0.0 0.0 0.0 0.0
-1.0 0.0 0.0 0.0
0.0 -1.0 0.0 0.0
0.0 0.0 -1.0 0.0
0.0 0.0 0.0 -1.0
RT = 4×4 Matrix{Float64}:
-1.49012e-8 0.0 0.0 0.0
0.0 -1.49012e-8 0.0 0.0
0.0 0.0 -1.49012e-8 0.0
0.0 0.0 0.0 -1.49012e-8
我们可以使用 qrupdate。
Q1,R1 = qrupdate(Q,R,u,v)
Q1 = Matrix(Q1)
Q1 = 5×4 Matrix{Float64}:
0.0 2.98023e-8 0.0 0.0
-1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
R1 = 4×4 Matrix{Float64}:
-1.49012e-8 -6.61744e-24 -9.92617e-24 -9.92617e-24
0.0 1.49012e-8 -3.30872e-24 -3.30872e-24
0.0 0.0 1.49012e-8 0.0
0.0 0.0 0.0 1.49012e-8
请注意这两个分解都正确,即使它们不同。
# 提示
qrupdate 仅适用于满矩阵
# 算法
qrupdate 使用由 Golub 与 van Loan 合著的 Matrix Computations 第三版第 12.5.1 节中的算法。qrupdate 很有用,因为如果我们采用 N = max(m,n),则从头计算新的 QR 分解大体上属于 O(N3) 算法,而以此方式仅更新现有因子属于 O(N2) 算法。
# 另请参阅
cholupdate | lu