qrupdate
QR 分解的秩 1 更新
语法
[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 是相应长度的列向量。
示例
矩阵
mu = sqrt(eps) mu = 1.4901e-08 A = [ones(1,4); mu*eye(4)];
是公认的最小平方示例,指明组成 A'*A 的危险。但我们使用 QR 分解 – 正交 Q 和上三角 R。
[Q,R] = qr(A);
正如我们期望的那样,R 是上三角。
R =
-1.0000 -1.0000 -1.0000 -1.0000
0 0.0000 0.0000 0.0000
0 0 0.0000 0.0000
0 0 0 0.0000
0 0 0 0在这种情况下,除了第一行,R 的上三角项都与 sqrt(eps) 类似。
请考虑更新向量
u = [-1 0 0 0 0]'; v = ones(4,1);
通过以下项从头更新到 A,而不是计算该秩毫无价值的 QR 分解:
[QT,RT] = qr(A + u*v')
QT =
0 0 0 0 1
-1 0 0 0 0
0 -1 0 0 0
0 0 -1 0 0
0 0 0 -1 0
RT =
1.0e-007 *
-0.1490 0 0 0
0 -0.1490 0 0
0 0 -0.1490 0
0 0 0 -0.1490
0 0 0 0我们可以使用 qrupdate。
[Q1,R1] = qrupdate(Q,R,u,v)
Q1 =
-0.0000 -0.0000 -0.0000 -0.0000 1.0000
1.0000 -0.0000 -0.0000 -0.0000 0.0000
0.0000 1.0000 -0.0000 -0.0000 0.0000
0.0000 0.0000 1.0000 -0.0000 0.0000
-0.0000 -0.0000 -0.0000 1.0000 0.0000
R1 =
1.0e-007 *
0.1490 0.0000 0.0000 0.0000
0 0.1490 0.0000 0.0000
0 0 0.1490 0.0000
0 0 0 0.1490
0 0 0 0请注意这两个分解都正确,即使它们不同。
提示
qrupdate 仅适用于满矩阵。
算法
qrupdate 使用由 Golub 与 van Loan 合著的 Matrix Computations 第三版第 12.5.1 节中的算法。qrupdate 很有用,因为如果我们采用 N = max(m,n),则从头计算新的 QR 分解大体上属于 O(N3) 算法,而以此方式仅更新现有因子属于 O(N2) 算法。
参考
[1] Golub, Gene H. and Charles Van Loan, Matrix Computations, Third Edition, Johns Hopkins University Press, Baltimore, 1996
扩展功能
版本历史记录
在 R2006a 之前推出
另请参阅
cholupdate | qr