qrupdate
QR 分解のランク 1 の更新
構文
[Q1,R1] = qrupdate(Q,R,u,v)
説明
[Q1,R1] = qrupdate(Q,R,u,v)
は、[Q,R] = qr(A)
が A
の元の QR 分解の場合、A + u*v'
の QR 分解を返します。ここで、u
と v
は、適切な長さの列ベクトルです。
例
行列
mu = sqrt(eps) mu = 1.4901e-08 A = [ones(1,4); mu*eye(4)];
は、A'*A
の作成での危険性を示す最小二乗で良く知られた例です。代わりに、直交行列 Q と上三角行列 R への QR 分解を使用します。
[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
にランク 1 の行列を加えたかなり自明な 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 の第 3 版の 12.5.1 節のアルゴリズムを使用します。 N = max(m,n)
の場合、何もない場合から新規の QR 分解を計算するのは、ほぼ O(N3) のアルゴリズムで、一方、この方法で既存の因子を更新するのは、O(N2) アルゴリズムであるため、qrupdate
は便利です。
参照
[1] Golub, Gene H. and Charles Van Loan, Matrix Computations, Third Edition, Johns Hopkins University Press, Baltimore, 1996
拡張機能
バージョン履歴
R2006a より前に導入
参考
cholupdate
| qr