Main Content

chol

説明

T = chol(A) は、T'*T = A となる上三角行列 T を返します。Aエルミート正定値行列でなければなりません。そうでない場合、この構文はエラーをスローします。

[T,p] = chol(A) は、Aコレスキー分解を計算します。この構文は、A がエルミート正定値行列でない場合はエラーになりません。A がエルミート正定値行列の場合、p は 0 です。それ以外の場合、Tsym([]) で、p は正の整数です (通常、p = 1 です)。

[T,p,S] = chol(A) は、行列 A がエルミート正定値である場合、T'*T = S'*A*S となる置換行列 S と値 p = 0 を返します。そうでない場合、正の整数 p と空のオブジェクト S = sym([]) を返します。

[T,p,s] = chol(A,'vector') は、置換情報を A(s,s) = T'*T となるベクトル s として返します。A がエルミート正定値行列として認識されない場合、p は正の整数であり、s = sym([]) です。

___ = chol(A,'lower') は、T*T' = A となる下三角行列 T を返します。

___ = chol(A,'nocheck') は、A がエルミート正定値かどうかのチェックをスキップします。'nocheck' を使用すると、シンボリック パラメーターについて追加の仮定を設定することなく、シンボリック パラメーターを含む行列のコレスキー分解を計算できます。

___ = chol(A,'real') は、実数演算を使用して A のコレスキー分解を計算します。この場合、chol は、エルミート分解 A = T'*T ではなく対称分解 A = T.'*T を計算します。この方法は、A が実数かつ対称であれば T'*T = T.'*T であるという事実に基づいています。'real' を使用して、結果に複素共役が含まれないようにします。

___ = chol(A,'lower','nocheck','real') では、オプションの引数を 1 つ以上指定して、A のコレスキー分解を計算します。指定できる引数は、'lower''nocheck' および 'real' です。これらオプションの引数の順序は任意です。

[T,p,s] = chol(A,'lower','vector','nocheck','real') は、A のコレスキー分解を計算し、置換情報をベクトル s として返します。オプションの引数を 1 つ以上指定することができます。指定できる引数は、'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 つの出力引数 Tp を使用します。行列がエルミート正定値として認識されない場合、この構文では、空のシンボリック オブジェクトが T に、値 1p に代入されます。

[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 の成立しない行列 Tchol によって返される可能性があります。決定不可能条件に対し isAlways が logical 0 (false) を返すようにするには、Unknownfalse に設定します。

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) を返すようにするには、Unknownfalse に設定します。

syms a
A = [a 0; 0 a];
isAlways(A == A','Unknown','false')
ans =
  2×2 logical array
     0     1
     1     0

ab に仮定を設定することで、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) を返すようにするには、Unknownfalse に設定します。

isAlways(A == T.'*T)
ans =
  2×2 logical array
     1     1
     1     1
isAlways(A == T'*T,'Unknown','false')
ans =
  2×2 logical array
     0     0
     0     0

入力引数

すべて折りたたむ

入力。数値、ベクトル、行列、または配列、あるいはシンボリック数、変数、配列、関数、または式で指定されます。

出力引数

すべて折りたたむ

上三角行列。T'*T = A となるようなシンボリック行列として返されます。T が下三角行列の場合、T*T' = A になります。

フラグ。シンボリック数として返されます。A がエルミート正定値である場合や 'nocheck' を使用する場合は、値 0

cholA がエルミート正定値行列であると判定されなかった場合、p は正の整数です。R は、R'*R = A(1:q,1:q) を満たす、階数が q = p - 1 の上三角行列です。

置換行列。シンボリック行列として返されます。

置換ベクトル。シンボリック ベクトルとして返されます。

制限

多くのシンボリック変数が含まれる行列計算は低速になる可能性があります。計算速度を向上させるには、特定の値を変数に代入することでシンボリック変数の数を減らします。

詳細

すべて折りたたむ

エルミート正定値行列

正方複素行列 A は、v'*A*v がすべての非ゼロ複素数ベクトル v に対して正の実数である場合にエルミート正定値となります。ここで、v'v の共役転置 (エルミート転置) です。

行列のコレスキー分解

n 行 n 列のエルミート正定値行列 A のコレスキー分解は、主対角要素が正の値である上三角行列または下三角行列によって定義されます。行列 A のコレスキー分解は T'*T = A として定義することができます。ここで、T は上三角行列で、T'T の共役転置です。コレスキー分解は T*T' = A と定義することもできます。ここで、T は下三角行列です。T は、A のコレスキー因子と呼ばれています。

ヒント

  • シンボリック オブジェクトではない数値引数について 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 で導入

参考

| | | | | | | |