Main Content

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 分解,其中 uv 是相应长度的列向量。

示例

矩阵

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 之前推出

另请参阅

|