MATLAB Function Reference | ![]() ![]() |
cholupdate
表示
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'
の上三角コレスキ分解を出力します。cholupdate
は、R
の対角部分と上三角部分のみを使います。R
の下三角部分は無視されます。
R1 = cholupdate(R,x,'+')
は、R1
= cholupdate(R,x)
と同じです。
R1 = cholupdate(R,x,'-')
は、 A
- x*x'
のコレスキ分解を出力します。R
が有効なコレスキ分解でないか、オリジナルの行列が正定行列でない場合は、エラーメッセージが表示され、コレスキ分解はありません。
[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なので、ランク1
の行列を加えたものです。
A + x*x' ans =
1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 21
chol
を使って、R1 = 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 19
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
は、LINPACKのサブルーチンZCHUD
とZCHDD
のアルゴリズムを使います。何もない場合から新規のコレスキ分解を計算するのは、
アルゴリズムで、この方法で既存の因子にランク1の行列を加えるのは
アルゴリズムなので、cholupdateは、役に立ちます。
参考文献
Dongarra, J.J., J.R. Bunch, C.B. Moler, and G.W. Stewart, LINPACK Users' Guide, SIAM, Philadelphia, 1979.
参考
![]() |
cholinc | cla | ![]() |