Main Content

eig

固有値と固有ベクトル

説明

e = eig(A) は、正方行列 A の固有値を含む列ベクトルを返します。

[V,D] = eig(A) は、固有値からなる対角行列 D と、対応する右固有ベクトルを列にもつ行列 V (つまり A*V = V*D) を返します。

[V,D,W] = eig(A) は、対応する左固有ベクトルを列にもつ非スパース行列 W (つまり W'*A = D*W') も返します。

固有値問題は、方程式 Av = λv の解を求めるものです。ここで、A は nn 列の行列、v は長さ n の列ベクトル、λ はスカラーです。この方程式を満たす λ の値は固有値です。この方程式を満たす v に相当する値が右固有ベクトルになります。左固有ベクトル w は式 w’A = λw’ を満たします。

e = eig(A,B) は、正方行列 A および B の一般化固有値を含む列ベクトルを返します。

[V,D] = eig(A,B) は、一般化固有値からなる対角行列 D と、対応する右固有ベクトルを列にもつ非スパース行列 V (つまり A*V = B*V*D) を返します。

[V,D,W] = eig(A,B) は、対応する左固有ベクトルを列にもつ非スパース行列 W (つまり W'*A = D*W'*B) も返します。

一般化固有値問題は、方程式 Av = λBv の解を求めるものです。ここで、A および B は nn 列の行列、v は長さ n の列ベクトル、λ はスカラーです。この方程式を満たす λ の値は一般化固有値です。v に相当する値が、一般化右固有ベクトルになります。左固有ベクトル w は式 w’A = λw’B を満たします。

[___] = eig(A,balanceOption) は、balanceOption"nobalance" の場合にアルゴリズム内の事前のバランス化手順を無効にします。balanceOption の既定値は "balance" であり、バランス化を有効にします。関数 eig は、前述の構文の出力引数のいずれでも返すことができます。

[___] = eig(A,B,algorithm) は、algorithm"chol" の場合に B のコレスキー分解を使用して一般化固有値を計算します。algorithm の既定値は A および B のプロパティによって異なりますが、A または B が非対称の場合は、QZ アルゴリズムを使用する "qz" になります。

[___] = 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*VV*D にほぼ等しい程度にしかなりません。言い換えると、A*V - V*D0 に近づきますが、厳密に等しくはなりません。

既定では、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*DA*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'*AD*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 が不完全であっても、VD が方程式 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*VV*D にほぼ等しい程度にしかなりません。言い換えると、A*V - V*D0 に近づきますが、厳密に等しくはなりません。

2 つの行列 AB を作成して、ペア (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*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-1A の一般化固有値を計算しようとすると、B\AInf 値を出力するため 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 つの実数固有値を返します。

最初の固有値と最初の固有ベクトルについて Av=λBv であることを確認します。

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
複素数のサポート: あり

一般化固有値問題の入力行列。実数または複素数の値からなる正方行列として指定します。BA と同じサイズでなければなりません。

データ型: double | single
複素数のサポート: あり

バランス オプション。事前のバランス化手順を有効にする "balance"、あるいは無効にする "nobalance" として指定します。ほとんどの場合、バランス化手順によって A の条件付けは改善され、より正確な結果が得られるようになります。ただし、バランス化によって不正確な結果が生じる場合があります。A にスケールが著しく異なる値が含まれる場合は "nobalance" を指定します。たとえば、A に非ゼロの整数の他に、ごく小さい (ゼロに近い) 値も含む場合、バランス化手順では、小さい値をスケーリングして整数と同じ意味をもたせる場合があり、不正確な結果が生じることがあります。

"balance" は既定の動作です。バランス化の詳細については、balance を参照してください。

一般化固有値アルゴリズム。"chol" または "qz" を指定して、ペアの一般化固有値の計算に使用するアルゴリズムを選択します。

アルゴリズム説明
"chol"B のコレスキー分解を使って、AB の一般化固有値を計算します。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 つの出力構文により固有値の対角行列を返します。

出力引数

すべて折りたたむ

固有値。多重度をもつ固有値 (またはペアの一般化固有値) を含む列ベクトルとして返されます。各固有値 e(k) は右固有ベクトル V(:,k) と左固有ベクトル W(:,k) に対応します。

右固有ベクトル。A の右固有ベクトルまたはペア (A,B) の一般化右固有ベクトルを列にもつ正方行列として返されます。V の形式と正規化は、入力引数の組み合わせによって異なります。

  • [V,D] = eig(A) は、A*V = V*D となるような、A の右固有ベクトルを列にもつ行列 V を返します。V の固有ベクトルは、個々の 2 ノルムが 1 となるように正規化されます。

    A が実対称エルミートまたは歪エルミートの場合、右固有ベクトル V は正規直交になります。

  • [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) の多重度をもつ固有値が主対角にある対角行列として返されます。各固有値 D(k,k) は右固有ベクトル V(:,k) と左固有ベクトル W(:,k) に対応します。

左固有ベクトル。A の左固有ベクトルまたはペア (A,B) の一般化左固有ベクトルを列にもつ正方行列として返されます。W の形式と正規化は、入力引数の組み合わせによって異なります。

  • [V,D,W] = eig(A) は、W'*A = D*W' となるような、A の左固有ベクトルを列にもつ行列 W を返します。W の固有ベクトルは、個々の 2 ノルムが 1 となるように正規化されます。A対称の場合、WV と同じになります。

  • [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) が含まれます。

    AB対称の場合、WV と同じになります。

マシンや MATLAB のリリースが異なる場合、異なる固有ベクトルが出力されることがありますが、数値的にはいずれも正確です。

  • 実数固有ベクトルでは、固有ベクトルの符号を変更できます。

  • 複素数固有ベクトルでは、絶対値が 1 の任意の複素数を固有ベクトルに乗算できます。

  • 重複固有値では、その固有ベクトルを線形結合によって再結合できます。たとえば、Ax = λx かつ Ay = λy の場合、A(x+y) = λ(x+y) であるため、x+y も A の固有ベクトルです。

詳細

すべて折りたたむ

対称行列

  • 非共役転置 A = A.' に等しい場合、正方行列 A は対称行列です。

    行列要素では、これは次を意味します。

    ai,j=aj,i.

  • 実数行列は複素共役に影響されないので、対称な実数行列もエルミート行列になります。例として、行列

    A=[100210101]

    は対称行列であると同時にエルミート行列でもあります。

歪対称行列

  • 非共役転置の打ち消し A = -A.' に等しい場合、正方行列 A は歪対称行列です。

    行列要素では、これは次を意味します。

    ai,j=aj,i.

  • 実数行列は複素共役に影響されないので、歪対称な実数行列も歪エルミート行列になります。例として、行列

    A=[0110]

    は歪対称行列であると同時に歪エルミート行列でもあります。

エルミート行列

  • 複素共役転置 A = A' に等しい場合、正方行列 A はエルミート行列です。

    行列要素では、これは次を意味します。

    ai,j=a¯j,i.

  • エルミート行列の対角のエントリは常に実数です。実数行列は複素共役に影響されないので、対称な実数行列もエルミート行列になります。例として、行列

    A=[100210101]

    は対称行列であると同時にエルミート行列でもあります。

  • エルミート行列の固有値は実数です。

歪エルミート行列

  • 複素共役転置の打ち消し A = -A' に等しい場合、正方行列 A は歪エルミート行列です。

    行列要素では、これは次を意味します。

    ai,j=a¯j,i.

  • 歪エルミート行列の対角のエントリは常に純粋な虚数かゼロです。実数行列は複素共役に影響されないので、歪対称な実数行列も歪エルミート行列になります。例として、行列

    A=[0110]

    は歪エルミート行列であると同時に歪対称行列でもあります。

  • 歪エルミート行列の固有値は純粋な虚数かゼロです。

ヒント

  • 関数 eig は、実対称であるスパース行列の固有値を計算できます。スパース行列の固有ベクトルや、実対称でないスパース行列の固有値を計算するには、関数 eigs を使用します。

拡張機能

バージョン履歴

R2006a より前に導入

すべて展開する

参考

| | | | | | |

トピック