cholupdate
コレスキー分解のランク 1 の更新
構文
R1 = cholupdate(R,x)
R1 = cholupdate(R,x,'+')
R1 = cholupdate(R,x,'-')
[R1,p] = cholupdate(R,x,'-')
説明
R1 = cholupdate(R,x) は、R = chol(A) が A の元のコレスキー分解である場合、A + x*x' の上三角コレスキー因子を返します。ここで、x は適切な長さの列ベクトルです。cholupdate は、R の対角要素と上三角部分のみを使用します。R の下三角部分は無視されます。
R1 = cholupdate(R,x,'+') は、R1 = cholupdate(R,x) と同じです。
R1 = cholupdate(R,x,'-') は、A - x*x' のコレスキー因子を返します。R が有効なコレスキー因子ではないか、復旧された (downdated) 行列が正定値ではないためにコレスキー分解が行われない場合には、エラー メッセージを表示します。
[R1,p] = cholupdate(R,x,'-') は、エラー メッセージを返しません。p が 0 の場合、R1 は A - x*x'' のコレスキー因子です。p が 0 より大きい場合、R1 は元の A のコレスキー因子です。p が 1 の場合、復旧された行列が正定値ではないので、cholupdate は失敗します。p が 2 の場合、R の上三角部分が有効なコレスキー因子ではないので、cholupdate は失敗します。
例
A = pascal(4)
A =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
R = chol(A)
R =
1 1 1 1
0 1 2 3
0 0 1 3
0 0 0 1
x = [0 0 0 1]';これは rank(x*x') が 1 であることから、A に対するランク 1 の更新 (update) と呼ばれます。
A + x*x' ans =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 21R1 = chol(A + x*x') でコレスキー因子を計算する代わりに、cholupdate を使用できます。
R1 = cholupdate(R,x) R1 =
1.0000 1.0000 1.0000 1.0000
0 1.0000 2.0000 3.0000
0 0 1.0000 3.0000
0 0 0 1.4142以下に、A の最後の要素から 1 を引いて、正定性を壊します (実際には行列を特異にします)。復旧された行列は、以下のようになります。
A - x*x'
ans =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 19chol と cholupdate を比較します。
R1 = chol(A-x*x') Error using chol Matrix must be positive definite. R1 = cholupdate(R,x,'-') Error using cholupdate Downdated matrix must be positive definite.
しかし、A の最後の要素から 0.5 を引くと正定値行列になるため、cholupdate を使用してコレスキー因子を比較することができます。
x = [0 0 0 1/sqrt(2)]';
R1 = cholupdate(R,x,'-')
R1 =
1.0000 1.0000 1.0000 1.0000
0 1.0000 2.0000 3.0000
0 0 1.0000 3.0000
0 0 0 0.7071ヒント
cholupdate は、完全な行列に対してのみ機能します。
拡張機能
バージョン履歴
R2006a より前に導入