chol
コレスキー分解
構文
説明
は、T = chol(A)T'*T = A となる上三角行列 T を返します。A はエルミート正定値行列でなければなりません。そうでない場合、この構文はエラーをスローします。
___ = chol( は、A,'nocheck')A がエルミート正定値かどうかのチェックをスキップします。'nocheck' を使用すると、シンボリック パラメーターについて追加の仮定を設定することなく、シンボリック パラメーターを含む行列のコレスキー分解を計算できます。
___ = chol( は、実数演算を使用して A,'real')A のコレスキー分解を計算します。この場合、chol は、エルミート分解 A = T'*T ではなく対称分解 A = T.'*T を計算します。この方法は、A が実数かつ対称であれば T'*T = T.'*T であるという事実に基づいています。'real' を使用して、結果に複素共役が含まれないようにします。
___ = chol( では、オプションの引数を 1 つ以上指定して、A,'lower','nocheck','real')A のコレスキー分解を計算します。指定できる引数は、'lower'、'nocheck' および 'real' です。これらオプションの引数の順序は任意です。
例
数値行列およびシンボリック行列のコレスキー分解の計算
3 行 3 列のヒルベルト行列のコレスキー分解を計算します。これらの数値はシンボリック オブジェクトではないため、結果は浮動小数点数となります。
chol(hilb(3))
ans =
1.0000 0.5000 0.3333
0 0.2887 0.2887
0 0 0.0745次に、この行列をシンボリック オブジェクトに変換し、コレスキー分解を計算します。
chol(sym(hilb(3)))
ans = [ 1, 1/2, 1/3] [ 0, 3^(1/2)/6, 3^(1/2)/6] [ 0, 0, 5^(1/2)/30]
下三角行列を返す
3 行 3 列のパスカル行列のコレスキー分解を計算し、結果として下三角行列を返します。
chol(sym(pascal(3)), 'lower')
ans = [ 1, 0, 0] [ 1, 1, 0] [ 1, 2, 1]
入力がエルミート正定値でない場合
次の行列のコレスキー分解を計算してみます。この行列はエルミート正定値ではないので、出力引数を一切指定せずに、または出力引数を 1 つだけ指定して chol を使用すると、エラーがスローされます。
A = sym([1 1 1; 1 2 3; 1 3 5]);
T = chol(A)
Error using sym/chol (line 132) Cannot prove that input matrix is Hermitian positive definite. Define a Hermitian positive definite matrix by setting appropriate assumptions on matrix components, or use 'nocheck' to skip checking whether the matrix is Hermitian positive definite.
このエラーを抑えるには、2 つの出力引数 T と p を使用します。行列がエルミート正定値として認識されない場合、この構文では、空のシンボリック オブジェクトが T に、値 1 が p に代入されます。
[T,p] = chol(A)
T =
[ empty sym ]
p =
1エルミート正定値行列の場合、p は 0 になります。
[T,p] = chol(sym(pascal(3)))
T =
[ 1, 1, 1]
[ 0, 1, 2]
[ 0, 0, 1]
p =
0または、'nocheck' を使用すると、A がエルミート正定値行列かどうかのチェックをスキップできます。したがって、このフラグを使用すると、成分について追加の仮定を設定することなく、シンボリック行列のコレスキー分解を計算し、それをエルミート正定値にできます。
syms a A = [a 0; 0 a]; chol(A,'nocheck')
ans = [ a^(1/2), 0] [ 0, a^(1/2)]
エルミート正定値ではない行列のコレスキー分解を計算するために 'nocheck' を使用した場合、恒等式 T'*T = A の成立しない行列 T が chol によって返される可能性があります。決定不可能条件に対し isAlways が logical 0 (false) を返すようにするには、Unknown を false に設定します。
T = chol(sym([1 1; 2 1]), 'nocheck')
T = [ 1, 2] [ 0, 3^(1/2)*1i]
isAlways(A == T'*T,'Unknown','false')
ans =
2×2 logical array
0 0
0 0置換行列を返す
3 行 3 列の逆ヒルベルト行列のコレスキー分解を計算し、置換行列を返します。
A = sym(invhilb(3)); [T, p, S] = chol(A)
T =
[ 3, -12, 10]
[ 0, 4*3^(1/2), -5*3^(1/2)]
[ 0, 0, 5^(1/2)]
p =
0
S =
1 0 0
0 1 0
0 0 1置換情報をベクトルとして返す
3 行 3 列の逆ヒルベルト行列のコレスキー分解を計算し、置換情報をベクトルとして返します。
A = sym(invhilb(3)); [T, p, S] = chol(A, 'vector')
T =
[ 3, -12, 10]
[ 0, 4*3^(1/2), -5*3^(1/2)]
[ 0, 0, 5^(1/2)]
p =
0
S =
1 2 3仮定を使用したエルミート正定値行列の作成
シンボリック パラメーターを含む行列 A のコレスキー分解を計算します。パラメーター a について追加の仮定が設定されない限り、この行列はエルミート行列ではありません。決定不可能条件に対し isAlways が logical 0 (false) を返すようにするには、Unknown を false に設定します。
syms a A = [a 0; 0 a]; isAlways(A == A','Unknown','false')
ans =
2×2 logical array
0 1
1 0a と b に仮定を設定することで、A がエルミート正定値であると定義できます。したがって、A のコレスキー分解を以下のように計算できます。
assume(a > 0) chol(A)
ans = [ a^(1/2), 0] [ 0, a^(1/2)]
計算を続けるため、a に設定された仮定を syms を使用して再作成することで削除します。
syms a
複素共役が含まれない実数の結果を返す
行列のコレスキー分解を計算します。この行列がエルミート正定値かどうかというチェックをスキップするには、'nocheck' を使用します。既定では、chol はエルミート分解 A = T'*T を計算します。そのため、結果には複素共役が含まれます。
syms a b A = [a b; b a]; T = chol(A, 'nocheck')
T = [ a^(1/2), conj(b)/conj(a^(1/2))] [ 0, (a*abs(a) - abs(b)^2)^(1/2)/abs(a)^(1/2)]
結果に複素共役が含まれないようにするには 'real' を使用します。
T = chol(A, 'nocheck', 'real')
T = [ a^(1/2), b/a^(1/2)] [ 0, ((a^2 - b^2)/a)^(1/2)]
このフラグを使用する場合、chol は、エルミート分解 A = T'*T ではなく対称分解 A = T.'*T を計算します。決定不可能条件に対し isAlways が logical 0 (false) を返すようにするには、Unknown を false に設定します。
isAlways(A == T.'*T)
ans =
2×2 logical array
1 1
1 1isAlways(A == T'*T,'Unknown','false')
ans =
2×2 logical array
0 0
0 0入力引数
出力引数
制限
多くのシンボリック変数が含まれる行列計算は低速になる可能性があります。計算速度を向上させるには、特定の値を変数に代入することでシンボリック変数の数を減らします。
詳細
ヒント
シンボリック オブジェクトではない数値引数について
cholを呼び出すと、MATLAB® 関数cholが呼び出されます。'nocheck'を使用した場合、恒等式T'*T = A(上三角行列Tについて) およびT*T' = A(下三角行列Tについて) の成立は保証されません。'real'を使用した場合、恒等式T'*T = A(上三角行列Tについて) およびT*T' = A(下三角行列Tについて) は、実数の対称正定値Aについてのみ成立が保証されます。'vector'を使用するには、3 つの出力引数を指定しなければなりません。その他のフラグについては、特定数の出力引数を指定する必要はありません。'vector'の代わりに'matrix'を使用した場合、cholは、既定の場合と同様に置換行列を返します。'lower'の代わりに'upper'を使用した場合、cholは、既定の場合と同様に上三角行列を返します。Aがエルミート正定値行列でない場合、引数pを含む構文は通常、p = 1および空のシンボリック オブジェクトTを返します。行列がエルミート行列かどうかをチェックするには、演算子
'(または、その関数形式ctranspose) を使用します。行列Aは、A'= Aであり、A'がAの共役転置である場合にのみエルミート行列となります。
バージョン履歴
R2013a で導入