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.2887 - 0.5000i 0.2887 + 0.5000i
-0.5774 + 0.0000i -0.5774 + 0.0000i -0.5774 + 0.0000i
-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.0444 + 0.0222i -0.0444 - 0.0222i
0.0888 + 0.0000i 0.0111 + 0.0777i 0.0111 - 0.0777i
-0.0444 + 0.0000i -0.0111 + 0.0833i -0.0111 - 0.0833i
理論上は、固有値分解はこの関係を満たします。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 = 0
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.0444 -0.1066 -0.0888
-0.0011 0.0442 0.0333
0 0.0266 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 になります。
マシンの精度に近い値を含む、悪条件の対称行列を作成します。
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*D1ans = 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 にほぼ等しい程度にしかなりません。
入力引数
入力行列。実数正方行列または複素正方行列として指定します。
データ型: double | single
複素数のサポート: あり
一般化固有値問題の入力行列。実数または複素数の値からなる正方行列として指定します。B は A と同じサイズでなければなりません。
データ型: double | single
複素数のサポート: あり
バランス オプション。事前のバランス化手順を有効にする "balance"、あるいは無効にする "nobalance" として指定します。ほとんどの場合、バランス化手順によって A の条件付けは改善され、より正確な結果が得られるようになります。ただし、バランス化によって不正確な結果が生じる場合があります。A にスケールが著しく異なる値が含まれる場合は "nobalance" を指定します。たとえば、A に非ゼロの整数の他に、ごく小さい (ゼロに近い) 値も含む場合、バランス化手順では、小さい値をスケーリングして整数と同じ意味をもたせる場合があり、不正確な結果が生じることがあります。
"balance" は既定の動作です。バランス化の詳細については、balance を参照してください。
一般化固有値アルゴリズム。"chol" または "qz" を指定して、ペアの一般化固有値の計算に使用するアルゴリズムを選択します。
| アルゴリズム | 説明 |
|---|---|
"chol" | B のコレスキー分解を使って、A と B の一般化固有値を計算します。A が対称 (エルミート) でない場合、または B が対称 (エルミート) 正定値でない場合、eig は代わりに QZ アルゴリズムを使用します。 |
"qz" | 一般化 Schur 分解とも呼ばれる QZ アルゴリズムを使用します。このアルゴリズムは A および B の対称性を無視します。 |
一般に、この 2 つのアルゴリズムは同じ結果を返します。QZ アルゴリズムは、悪条件の行列を伴うような特定の問題に対してより安定しています。
A または B が非対称の場合は、指定するアルゴリズムにかかわらず、関数 eig は常に QZ アルゴリズムを使用します。
固有値の出力形式。"vector" または "matrix" として指定します。このオプションにより、固有値を列ベクトルまたは対角行列のいずれで返すかが指定できます。既定の動作は、指定された出力の数により異なります。
e = eig(A)のように出力を 1 つ指定する場合、既定では、固有値は列ベクトルとして返されます。[V,D] = eig(A)のように 2 つまたは 3 つの出力を指定する場合、既定では、固有値は対角行列Dとして返されます。
例: D = eig(A,"matrix") は、1 つの出力構文により固有値の対角行列を返します。
出力引数
右固有ベクトル。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 の固有ベクトルです。
左固有ベクトル。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を使用します。
拡張機能
使用上の注意および制限:
Vは基底が異なる固有ベクトルを表す場合があります。この表現は、生成されたコードで計算された固有ベクトルは、C および C++ コードと MATLAB で異なる可能性があることを意味します。Dの固有値の順序は MATLAB と異なる場合があります。固有値問題の方程式A*V = V*Dを使用して、V値とD値を検証できます。LAPACK ライブラリ コールバック クラスを指定する場合、コード ジェネレーターでは以下のオプションがサポートされます。
左固有ベクトルの計算。
出力は複素数になります。
コード生成では、この関数のスパース行列入力はサポートされません。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
eig 関数は GPU 配列入力をサポートしますが、次の使用上の注意および制限があります。
一般化の場合、
eig(A,B)、A、およびBは、実対称または複素エルミートでなければなりません。さらに、Bは正定値でなければなりません。QZ アルゴリズム
eig(A,B,"qz")はサポートされません。
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
使用上の注意および制限:
一般化の場合、
eig(A,B)、A、およびBは、実対称または複素エルミートでなければなりません。さらに、Bは正定値でなければなりません。非スパース分散配列では、以下の構文がサポートされません。
[__] = eig(A,B,"qz")[V,D,W] = eig(A,B)
詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入eig は、入力に非有限の値 (Inf または NaN) が含まれていると NaN 値を返します。以前は、入力に非有限の値が含まれていると eig からエラーがスローされていました。
歪エルミートの入力行列のアルゴリズムが改善されました。関数呼び出し [V,D] = eig(A) (A は歪エルミート) を使用すると、eig により固有ベクトルの行列 V がユニタリになり、固有値の対角行列 D が純粋な虚数になることが確実になります。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)