ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

構文

R = chol(A)
L = chol(A,'lower')
R = chol(A,'upper')
[R,p] = chol(A)
[L,p] = chol(A,'lower')
[R,p] = chol(A,'upper')
[R,p,S] = chol(A)
[R,p,s] = chol(A,'vector')
[L,p,s] = chol(A,'lower','vector')
[R,p,s] = chol(A,'upper','vector')

説明

R = chol(A) は、行列 A の対角および上三角部分から、方程式 R'*R=A を満たす上三角行列 R を作成します。関数 cholA が (複素エルミート) 対称であると仮定します。そうでない場合、chol は、上三角部分の (複素共役) 転置を下三角部分として使用します。A は、正定行列でなければなりません。

L = chol(A,'lower') は、行列 A の対角および下三角部分から、方程式 L*L'=A を満たす下三角行列 L を作成します。関数 cholA が (複素エルミート) 対称であると仮定します。そうでない場合、chol は、下三角部分の (複素共役) 転置を上三角部分として使用します。A がスパースな場合、chol は一般に、この構文のほうがより高速です。A は、正定行列でなければなりません。R = chol(A,'upper') は、R = chol(A) と同じです。

[R,p] = chol(A)A が正定の場合、行列 A の対角および上三角部分から、方程式 R'*R=A および p がゼロを満たす上三角行列 R を作成します。A が正定ではない場合には、p が正の整数となり、MATLAB® はエラーを生成しません。A が非スパース行列の場合、R は、R'*R=A(1:q,1:q) となる次数 q=p-1 の上三角行列です。A がスパースの場合、R は、R'*R の最初の q 行および最初の q 列からなる L 字型の部分が A の対応部分と一致する、サイズが qn 列の上三角行列です。

[L,p] = chol(A,'lower')A が正定の場合、行列 A の対角および下三角部分から、方程式 L*L'=A および p がゼロを満たす下三角行列 L を作成します。A が正定ではない場合には、p が正の整数となり、MATLAB はエラーを生成しません。A が非スパース行列の場合、L は、L*L'=A(1:q,1:q) となる次数 q=p-1 の下三角行列です。A がスパースの場合、L は、L*L' の最初の q 行および最初の q 列からなる L 形状の部分が A の対応部分と一致する、サイズが qn 列の下三角行列です。[R,p] = chol(A,'upper') は、[R,p] = chol(A) と同じです。

次の 3 出力の構文には、スパース入力 A が必要です。

[R,p,S] = chol(A) は、A がスパースの場合、置換行列 S を返します。S の並べ替えは、amd で得られる結果とは異なる場合があることに注意してください。これは chol が、パフォーマンス向上のために並びを多少変更するためです。p=0 の場合、RR'*R=S'*A*S となる上三角行列です。p がゼロではない場合、R は、R'*R の最初の q 行および最初の q 列からなる L 字型の部分が S'*A*S の対応部分と一致する、サイズが qn 列の上三角行列です。S'*A*S という因子は、A という因子よりスパースになる傾向があります。

[R,p,s] = chol(A,'vector') は、A がスパースの場合、p=0 のときに A(s,s)=R'*R となるベクトル s として置換情報を返します。'vector' の代わりに 'matrix' オプションを使用すると、既定の動作が得られます。

[L,p,s] = chol(A,'lower','vector') は、A がスパースの場合に、A の対角および下三角部分のみを使用して、下三角行列 Lp=0 の場合に A(s,s)=L*L' となる置換ベクトル s を返します。前述のように、'vector' の代わりに 'matrix' オプションを使用すると、置換行列が得られます。[R,p,s] = chol(A,'upper','vector') は、[R,p,s] = chol(A,'vector') と同じです。

    メモ:   正定性を判断するには、eig よりも chol を使用するほうが望ましい方法です。

例 1

関数 gallery により、対称正定行列がいくつか得られます。

A=gallery('moler',5)

A =

     1    -1    -1    -1    -1
    -1     2     0     0     0
    -1     0     3     1     1
    -1     0     1     4     2
    -1     0     1     2     5

C=chol(A)

ans =

     1    -1    -1    -1    -1
     0     1    -1    -1    -1
     0     0     1    -1    -1
     0     0     0     1    -1
     0     0     0     0     1
isequal(C'*C,A)

ans =

     1

スパース入力行列の場合、関数 chol はコレスキー因子を返します。

N = 100;
A = gallery('poisson', N); 

N は、正方形の NN 列グリッドの 1 方向におけるグリッド ポイントの数を表します。したがって、A は、N2 x N2 です。

L = chol(A, 'lower');
D = norm(A - L*L', 'fro');

D の値は、MATLAB のバージョンによっていくぶん異なりますが、1014 の次数となります。

例 2

二項係数を対称に並べると、正定行列になります。

n = 5;
X = pascal(n)
X =
    1    1    1    1    1
    1    2    3    4    5
    1    3    6   10   15
    1    4   10   20   35
    1    5   15   35   70

この行列が興味深いのは、コレスキー因子が同じ係数で構成され、上三角行列に並ぶからです。

R = chol(X)
R =
    1    1    1    1    1
    0    1    2    3    4
    0    0    1    3    6
    0    0    0    1    4
    0    0    0    0    1

最後の要素から 1 を引くと、正定性が壊されます (実際には行列を特異にします)。

X(n,n) = X(n,n)-1

X =
    1    1    1    1    1
    1    2    3    4    5
    1    3    6   10   15
    1    4   10   20   35
    1    5   15   35   69

この行列で X のコレスキー分解を試みても成功しません。

chol(X)
Error using chol
Matrix must be positive definite.

参考

|

この情報は役に立ちましたか?