| 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 |