このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
eig
固有値と固有ベクトル
構文
説明
[___] = eig(
は、A
,balanceOption
)balanceOption
が 'nobalance'
の場合にアルゴリズム内の事前のバランス化手順を無効にします。balanceOption
の既定値は 'balance'
であり、バランス化を有効にします。関数 eig
は、前述の構文の出力引数のいずれでも返すことができます。
[___] = eig(___,
は、前述の構文の任意の入力引数または出力引数を使用して、outputForm
)outputForm
で指定された形式で固有値を返します。outputForm
には、固有値を列ベクトルとして返す場合は 'vector'
、固有値を対角行列として返す場合は 'matrix'
を指定します。
例
行列の固有値
gallery
を使用して対称正定値行列を作成します。
A = gallery('lehmer',4)
A = 4×4
1.0000 0.5000 0.3333 0.2500
0.5000 1.0000 0.6667 0.5000
0.3333 0.6667 1.0000 0.7500
0.2500 0.5000 0.7500 1.0000
A
の固有値を計算します。結果は列ベクトルになります。
e = eig(A)
e = 4×1
0.2078
0.4078
0.8482
2.5362
あるいは、outputForm
を使用して固有値を対角行列に返します。
D = eig(A,'matrix')
D = 4×4
0.2078 0 0 0
0 0.4078 0 0
0 0 0.8482 0
0 0 0 2.5362
行列の固有値と固有ベクトル
gallery
を使用して、循環行列を作成します。
A = gallery('circul',3)
A = 3×3
1 2 3
3 1 2
2 3 1
A
の固有値と右固有ベクトルを計算します。
[V,D] = eig(A)
V = 3×3 complex
-0.5774 + 0.0000i 0.5774 + 0.0000i 0.5774 + 0.0000i
-0.5774 + 0.0000i -0.2887 - 0.5000i -0.2887 + 0.5000i
-0.5774 + 0.0000i -0.2887 + 0.5000i -0.2887 - 0.5000i
D = 3×3 complex
6.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i -1.5000 + 0.8660i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i -1.5000 - 0.8660i
結果が A*V = V*D
を満たすことを確認します。
A*V - V*D
ans = 3×3 complex
10-14 ×
-0.2665 + 0.0000i -0.0888 - 0.0111i -0.0888 + 0.0111i
0.0888 + 0.0000i 0.0000 + 0.0833i 0.0000 - 0.0833i
-0.0444 + 0.0000i -0.1157 + 0.0666i -0.1157 - 0.0666i
理論上は、固有値分解はこの関係を満たします。eig
は浮動小数点計算を使用して分解を行うため、A*V
は V*D
にほぼ等しい程度にしかなりません。言い換えると、A*V - V*D
は 0
に近づきますが、厳密に等しくはなりません。
固有値と固有ベクトルの並べ替え
既定では、eig
は固有値と固有ベクトルを常に並べ替えられた順序で返すとは限りません。関数 sort
を使用して、固有値を昇順に並べて、対応する固有ベクトルを並べ替えます。
5 行 5 列の魔方陣行列の固有値と固有ベクトルを計算します。
A = magic(5)
A = 5×5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
[V,D] = eig(A)
V = 5×5
-0.4472 0.0976 -0.6330 0.6780 -0.2619
-0.4472 0.3525 0.5895 0.3223 -0.1732
-0.4472 0.5501 -0.3915 -0.5501 0.3915
-0.4472 -0.3223 0.1732 -0.3525 -0.5895
-0.4472 -0.6780 0.2619 -0.0976 0.6330
D = 5×5
65.0000 0 0 0 0
0 -21.2768 0 0 0
0 0 -13.1263 0 0
0 0 0 21.2768 0
0 0 0 0 13.1263
A
の固有値は D
の対角上にあります。ただし、固有値は並べ替えられていません。
diag(D)
を使用して D
の対角から固有値を抽出してから、結果のベクトルを昇順に並べ替えます。sort
の 2 番目の出力はインデックスの置換ベクトルを返します。
[d,ind] = sort(diag(D))
d = 5×1
-21.2768
-13.1263
13.1263
21.2768
65.0000
ind = 5×1
2
3
5
4
1
ind
を使用して D
の対角要素を並べ替えます。D
の固有値は V
の列内の固有ベクトルに対応するため、同じインデックスを使用して V
の列も並べ替えなければなりません。
Ds = D(ind,ind)
Ds = 5×5
-21.2768 0 0 0 0
0 -13.1263 0 0 0
0 0 13.1263 0 0
0 0 0 21.2768 0
0 0 0 0 65.0000
Vs = V(:,ind)
Vs = 5×5
0.0976 -0.6330 -0.2619 0.6780 -0.4472
0.3525 0.5895 -0.1732 0.3223 -0.4472
0.5501 -0.3915 0.3915 -0.5501 -0.4472
-0.3223 0.1732 -0.5895 -0.3525 -0.4472
-0.6780 0.2619 0.6330 -0.0976 -0.4472
(V,D)
と (Vs,Ds)
はいずれも A
の固有値分解を出力します。A*V-V*D
と A*Vs-Vs*Ds
の結果は丸め誤差を除けば一致します。
e1 = norm(A*V-V*D); e2 = norm(A*Vs-Vs*Ds); e = abs(e1 - e2)
e = 1.2622e-29
左固有ベクトル
3 行 3 列の行列を作成します。
A = [1 7 3; 2 9 12; 5 22 7];
右固有ベクトル V
、固有値 D
、および左固有ベクトル W
を計算します。
[V,D,W] = eig(A)
V = 3×3
-0.2610 -0.9734 0.1891
-0.5870 0.2281 -0.5816
-0.7663 -0.0198 0.7912
D = 3×3
25.5548 0 0
0 -0.5789 0
0 0 -7.9759
W = 3×3
-0.1791 -0.9587 -0.1881
-0.8127 0.0649 -0.7477
-0.5545 0.2768 0.6368
結果が W'*A = D*W'
を満たすことを確認します。
W'*A - D*W'
ans = 3×3
10-13 ×
-0.0266 -0.2132 -0.1243
0.0056 -0.0286 -0.0072
-0.0022 0 -0.0178
理論上は、固有値分解はこの関係を満たします。eig
は浮動小数点計算を使用して分解を行うため、W'*A
は D*W'
にほぼ等しい程度にしかなりません。言い換えると、W'*A - D*W'
は 0
に近づきますが、厳密に等しくはなりません。
対角化できない (不完全) 行列の固有値
3 行 3 列の行列を作成します。
A = [3 1 0; 0 3 1; 0 0 3];
A
の固有値と右固有ベクトルを計算します。
[V,D] = eig(A)
V = 3×3
1.0000 -1.0000 1.0000
0 0.0000 -0.0000
0 0 0.0000
D = 3×3
3 0 0
0 3 0
0 0 3
A
は反復固有値をもち、固有ベクトルは独立していません。つまり、A
は対角化できず、したがって不完全であるということです。
A
が不完全であっても、V
と D
が方程式 A*V = V*D
を満たすことを確認します。
A*V - V*D
ans = 3×3
10-15 ×
0 0.8882 -0.8882
0 0 0.0000
0 0 0
理論上は、固有値分解はこの関係を満たします。eig
は浮動小数点計算を使用して分解を行うため、A*V
は V*D
にほぼ等しい程度にしかなりません。言い換えると、A*V - V*D
は 0
に近づきますが、厳密に等しくはなりません。
一般化固有値
2 つの行列 A
と B
を作成して、ペア (A,B)
の固有値と右固有ベクトルの一般化固有値問題を解きます。
A = [1/sqrt(2) 0; 0 1]; B = [0 1; -1/sqrt(2) 0]; [V,D]=eig(A,B)
V = 2×2 complex
1.0000 + 0.0000i 1.0000 + 0.0000i
0.0000 - 0.7071i 0.0000 + 0.7071i
D = 2×2 complex
0.0000 + 1.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 - 1.0000i
結果が A*V = B*V*D
を満たすことを確認します。
A*V - B*V*D
ans = 2×2
0 0
0 0
残差誤差 A*V - B*V*D
は厳密に 0 になります。
悪条件の行列対応の QZ アルゴリズムを使用する一般化固有値
マシンの精度に近い値を含む、悪条件の対称行列を作成します。
format long e A = diag([10^-16, 10^-15])
A = 2×2
1.000000000000000e-16 0
0 1.000000000000000e-15
既定のアルゴリズムを使用して、一般化固有値と一連の右固有ベクトルを計算します。この場合、既定のアルゴリズムは 'chol'
です。
[V1,D1] = eig(A,A)
V1 = 2×2
1.000000000000000e+08 0
0 3.162277660168380e+07
D1 = 2×2
9.999999999999999e-01 0
0 1.000000000000000e+00
ここで、'qz'
アルゴリズムを使用して、一般化固有値と一連の右固有ベクトルを計算します。
[V2,D2] = eig(A,A,'qz')
V2 = 2×2
1 0
0 1
D2 = 2×2
1 0
0 1
'chol'
の結果が A*V1 = A*V1*D1
をどの程度満たすかをチェックします。
format short
A*V1 - A*V1*D1
ans = 2×2
10-23 ×
0.1654 0
0 -0.6617
次に 'qz'
の結果が A*V2 = A*V2*D2
をどの程度満たすかをチェックします。
A*V2 - A*V2*D2
ans = 2×2
0 0
0 0
両方とも対称行列である場合、eig
は既定で 'chol'
アルゴリズムを使用します。この場合、QZ アルゴリズムがより正確な結果を返します。
一方が特異行列である場合の一般化固有値
2 行 2 列の単位行列 A
と、特異行列 B
を作成します。
A = eye(2); B = [3 6; 4 8];
コマンド [V,D] = eig(B\A)
を使用して行列 の一般化固有値を計算しようとすると、B\A
が Inf
値を出力するため MATLAB® はエラーを返します。
代わりに、関数 eig
に両方の行列を渡して、一般化固有値と右固有ベクトルを計算します。
[V,D] = eig(A,B)
V = 2×2
-0.7500 -1.0000
-1.0000 0.5000
D = 2×2
0.0909 0
0 Inf
両方の行列を別々に渡し、問題の求解に最適なアルゴリズムを eig
に選択させるほうがよい結果になります。この例で、eig(A,B)
は、B
が可逆でなくても、一連の固有ベクトルと少なくとも 1 つの実数固有値を返します。
最初の固有値と最初の固有ベクトルについて であることを確認します。
eigval = D(1,1); eigvec = V(:,1); A*eigvec - eigval*B*eigvec
ans = 2×1
10-15 ×
0.1110
0.2220
理論上は、固有値分解はこの関係を満たします。浮動小数点計算を使用して分解が行われるため、A*eigvec
は、この例で計算されたとおり、eigval*B*eigvec
にほぼ等しい程度にしかなりません。
入力引数
A
— 入力行列
正方行列
入力行列。実数正方行列または複素正方行列として指定します。
データ型: double
| single
複素数のサポート: あり
B
— 一般化固有値問題の入力行列。
正方行列
一般化固有値問題の入力行列。実数または複素数の値からなる正方行列として指定します。B
は A
と同じサイズでなければなりません。
データ型: double
| single
複素数のサポート: あり
balanceOption
— バランス オプション
'balance'
(既定値) | 'nobalance'
バランス オプション。事前のバランス化手順を有効にする 'balance'
、あるいは無効にする 'nobalance'
として指定します。ほとんどの場合、バランス化手順によって A
の条件付けは改善され、より正確な結果が得られるようになります。ただし、バランス化によって不正確な結果が生じる場合があります。A
にスケールが著しく異なる値が含まれる場合は 'nobalance'
を指定します。たとえば、A
に非ゼロの整数の他に、ごく小さい (ゼロに近い) 値も含む場合、バランス化手順では、小さい値をスケーリングして整数と同じ意味をもたせる場合があり、不正確な結果が生じることがあります。
'balance'
は既定の動作です。バランス化の詳細については、balance
を参照してください。
algorithm
— 一般化固有値アルゴリズム
'chol'
| 'qz'
一般化固有値アルゴリズム。'chol'
または 'qz'
を指定して、ペアの一般化固有値の計算に使用するアルゴリズムを選択します。
アルゴリズム | 説明 |
---|---|
'chol' | B のコレスキー分解を使って、A と B の一般化固有値を計算します。 |
'qz' | 一般化 Schur 分解とも呼ばれる QZ アルゴリズムを使用します。このアルゴリズムは A および B の対称性を無視します。 |
一般に、この 2 つのアルゴリズムは同じ結果を返します。QZ アルゴリズムは、悪条件の行列を伴うような特定の問題に対してより安定しています。
algorithm
引数を省略すると、関数 eig
は、A
と B
のプロパティに基づいてアルゴリズムを選択します。この関数は、対称 (エルミート) A
と対称 (エルミート) 正定値 B
に対しては、'chol'
アルゴリズムを使用します。それ以外については 'qz'
アルゴリズムを使用します。
A
または B
が非対称の場合は、指定するアルゴリズムにかかわらず、関数 eig
は常に QZ アルゴリズムを使用します。
outputForm
— 固有値の出力形式
'vector'
| 'matrix'
固有値の出力形式。'vector'
または 'matrix'
として指定します。このオプションにより、固有値を列ベクトルまたは対角行列のいずれで返すかが指定できます。既定の動作は、指定された出力の数により異なります。
e = eig(A)
のように出力を 1 つ指定する場合、既定では、固有値は列ベクトルとして返されます。[V,D] = eig(A)
のように 2 つまたは 3 つの出力を指定する場合、既定では、固有値は対角行列D
として返されます。
例: D = eig(A,'matrix')
は、1 つの出力構文により固有値の対角行列を返します。
出力引数
V
— 右固有ベクトル
正方行列
右固有ベクトル。A
の右固有ベクトルまたはペア (A,B)
の一般化右固有ベクトルを列にもつ正方行列として返されます。V
の形式と正規化は、入力引数の組み合わせによって異なります。
[V,D] = eig(A)
は、A*V = V*D
となるような、A
の右固有ベクトルを列にもつ行列V
を返します。V
の固有ベクトルは、個々の 2 ノルムが 1 となるように正規化されます。[V,D] = eig(A,'nobalance')
は、行列V
も返します。ただし、各固有ベクトルの 2 ノルムは必ずしも 1 である必要はありません。[V,D] = eig(A,B)
および[V,D] = eig(A,B,algorithm)
は、A*V = B*V*D
を満たす一般化右固有ベクトルを列にもつ行列としてV
を返します。各固有ベクトルの 2 ノルムは必ずしも 1 である必要はありません。この場合、D
には、主対角に沿ってペアの一般化固有値(A,B)
が含まれます。eig
で'chol'
アルゴリズムと対称 (エルミート) 行列A
および対称 (エルミート) 正定値B
を使用する場合、V
の固有ベクトルは、個々のB
ノルムが 1 になるように正規化されます。
マシンや MATLAB® のリリースが異なる場合、異なる固有ベクトルが出力されることがありますが、数値的にはいずれも正確です。
実数固有ベクトルでは、固有ベクトルの符号を変更できます。
複素数固有ベクトルでは、絶対値が 1 の任意の複素数を固有ベクトルに乗算できます。
重複固有値では、その固有ベクトルを線形結合によって再結合できます。たとえば、Ax = λx かつ Ay = λy の場合、A(x+y) = λ(x+y) であるため、x+y も A の固有ベクトルです。
W
— 左固有ベクトル
正方行列
左固有ベクトル。A
の左固有ベクトルまたはペア (A,B)
の一般化左固有ベクトルを列にもつ正方行列として返されます。W
の形式と正規化は、入力引数の組み合わせによって異なります。
[V,D,W] = eig(A)
は、W'*A = D*W'
となるような、A
の左固有ベクトルを列にもつ行列W
を返します。W
の固有ベクトルは、個々の 2 ノルムが 1 となるように正規化されます。A
が対称の場合、W
はV
と同じになります。[V,D,W] = eig(A,'nobalance')
は、行列W
も返します。ただし、各固有ベクトルの 2 ノルムは必ずしも 1 である必要はありません。[V,D,W] = eig(A,B)
および[V,D,W] = eig(A,B,algorithm)
は、W'*A = D*W'*B
を満たす一般化左固有ベクトルを列にもつ行列としてW
を返します。各固有ベクトルの 2 ノルムは必ずしも 1 である必要はありません。この場合、D
には、主対角に沿ってペアの一般化固有値(A,B)
が含まれます。A
とB
が対称の場合、W
はV
と同じになります。
マシンや MATLAB のリリースが異なる場合、異なる固有ベクトルが出力されることがありますが、数値的にはいずれも正確です。
実数固有ベクトルでは、固有ベクトルの符号を変更できます。
複素数固有ベクトルでは、絶対値が 1 の任意の複素数を固有ベクトルに乗算できます。
重複固有値では、その固有ベクトルを線形結合によって再結合できます。たとえば、Ax = λx かつ Ay = λy の場合、A(x+y) = λ(x+y) であるため、x+y も A の固有ベクトルです。
詳細
対称行列
非共役転置
A = A.'
に等しい場合、正方行列A
は対称行列です。行列要素では、これは次を意味します。
実数行列は複素共役に影響されないので、対称な実数行列もエルミート行列になります。例として、行列
は対称行列であると同時にエルミート行列でもあります。
歪対称行列
非共役転置の打ち消し
A = -A.'
に等しい場合、正方行列A
は歪対称行列です。行列要素では、これは次を意味します。
実数行列は複素共役に影響されないので、歪対称な実数行列も歪エルミート行列になります。例として、行列
は歪対称行列であると同時に歪エルミート行列でもあります。
エルミート行列
複素共役転置
A = A'
に等しい場合、正方行列A
はエルミート行列です。行列要素では、これは次を意味します。
エルミート行列の対角のエントリは常に実数です。実数行列は複素共役に影響されないので、対称な実数行列もエルミート行列になります。例として、行列
は対称行列であると同時にエルミート行列でもあります。
エルミート行列の固有値は実数です。
歪エルミート行列
複素共役転置の打ち消し
A = -A'
に等しい場合、正方行列A
は歪エルミート行列です。行列要素では、これは次を意味します。
歪エルミート行列の対角のエントリは常に純粋な虚数かゼロです。実数行列は複素共役に影響されないので、歪対称な実数行列も歪エルミート行列になります。例として、行列
は歪エルミート行列であると同時に歪対称行列でもあります。
歪エルミート行列の固有値は純粋な虚数かゼロです。
ヒント
関数
eig
は、実対称であるスパース行列の固有値を計算できます。スパース行列の固有ベクトルや、実対称でないスパース行列の固有値を計算するには、関数eigs
を使用します。
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
V
は基底が異なる固有ベクトルを表す場合があります。この表現は、生成されたコードで計算された固有ベクトルは、C および C++ コードと MATLAB で異なる可能性があることを意味します。D
の固有値の順序は MATLAB と異なる場合があります。固有値問題の方程式A*V = V*D
を使用して、V
値とD
値を検証できます。LAPACK ライブラリ コールバック クラスを指定する場合、コード ジェネレーターでは以下のオプションがサポートされます。
左固有ベクトルの計算。
出力は複素数になります。
コード生成では、この関数のスパース行列入力はサポートされません。
スレッドベースの環境
MATLAB® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
関数 eig
は GPU 配列を部分的にサポートしています。この関数の一部の構文は、入力データを gpuArray
(Parallel Computing Toolbox) として指定すると、GPU で実行されます。使用上の注意事項および制限事項:
一般化の場合、
eig(A,B)
、A
、およびB
は、実対称または複素エルミートでなければなりません。さらに、B
は正定値でなければなりません。QZ アルゴリズム
eig(A,B,'qz')
はサポートされません。
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
分散配列
Parallel Computing Toolbox™ を使用して、クラスターの結合メモリ上で大きなアレイを分割します。
使用上の注意事項および制限事項:
一般化の場合、
eig(A,B)
、A
、およびB
は、実対称または複素エルミートでなければなりません。さらに、B
は正定値でなければなりません。非スパース分散配列では、以下の構文がサポートされません。
[__] = eig(A,B,'qz')
[V,D,W] = eig(A,B)
詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入R2021b: eig
は非有限の入力に対して NaN
を返す
eig
は、入力に非有限の値 (Inf
または NaN
) が含まれていると NaN
値を返します。以前は、入力に非有限の値が含まれていると eig
からエラーがスローされていました。
R2021a: 歪エルミート行列のアルゴリズムの改善
歪エルミートの入力行列のアルゴリズムが改善されました。関数呼び出し [V,D] = eig(A)
(A
は歪エルミート) を使用すると、eig
により固有ベクトルの行列 V
がユニタリになり、固有値の対角行列 D
が純粋な虚数になることが確実になります。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)