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