이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

eig

고유값(Eigenvalue)과 고유벡터(Eigenvector)

설명

예제

e = eig(A)는 정사각 행렬 A의 고유값을 포함하는 열 벡터를 반환합니다.

예제

[V,D] = eig(A)A*V = V*D를 충족하는, 고유값으로 구성된 대각 행렬 D와 각 열이 이에 대응하는 우고유벡터(Right Eigenvector)인 행렬 V를 반환합니다.

예제

[V,D,W] = eig(A)는 또한 W'*A = D*W'를 충족하는, 각 열이 이에 대응하는 좌고유벡터(Left Eigenvector)인 비희소 행렬(Full Matrix) W를 반환합니다.

고유값 문제는 Av = λv 방정식의 해를 구하는 것입니다. 여기서 A는 nxn 행렬이고 v는 길이가 n인 열 벡터이며 λ는 스칼라입니다. 방정식을 충족하는 λ의 값이 고유값입니다. 방정식을 충족하는 v의 대응값은 우고유벡터(Right Eigenvector)입니다. 좌고유벡터 w는 w’A = λw’ 방정식을 충족합니다.

예제

e = eig(A,B)는 정사각 행렬 AB의 일반 고유값을 포함하는 열 벡터를 반환합니다.

예제

[V,D] = eig(A,B)A*V = B*V*D를 충족하는, 일반 고유값으로 구성된 대각 행렬 D와 각 열이 이에 대응하는 우고유벡터인 비희소 행렬 V를 반환합니다.

[V,D,W] = eig(A,B)는 또한 W'*A = D*W'*B를 충족하는, 각 열이 이에 대응하는 좌고유벡터(Left Eigenvector)인 비희소 행렬(Full Matrix) W를 반환합니다.

일반 고유값 문제는 Av = λBv 방정식의 해를 구하는 것입니다. 여기서 A와 B는 nxn 행렬이고, v는 n 길이의 열 벡터이며 λ는 스칼라입니다. 방정식을 충족하는 λ의 값이 일반 고유값입니다. v의 대응값은 일반화된 우고유벡터(Right Eigenvector)입니다. 좌고유벡터 w는 w’A = λw’B 방정식을 충족합니다.

[___] = eig(A,balanceOption)balanceOption'nobalance'일 때, 알고리즘에서 예비 밸런싱 단계를 비활성화합니다. balanceOption의 디폴트 값은 'balance'이며, 이 경우 밸런싱이 활성화됩니다. eig 함수는 위에 열거된 구문에 포함된 모든 출력 인수를 반환할 수 있습니다.

예제

[___] = eig(A,B,algorithm)algorithm'chol'일 때, B에 대한 촐레스키 분해(Cholesky Factorization)를 사용하여 일반 고유값을 계산합니다. algorithm의 디폴트 값은 AB의 속성에 따라 달라지지만, 일반적으로 QZ 알고리즘을 사용하는 'qz'입니다.

A가 에르미트(Hermitian) 행렬이고 B가 에르미트 양의 정부호 행렬인 경우 algorithm의 디폴트 값은 'chol'입니다.

예제

[___] = eig(___,eigvalOption)은 위에 열거된 구문에 포함된 입력 인수 또는 출력 인수를 사용하여 eigvalOption으로 지정된 형태로 고유값을 반환합니다. eigvalOption'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

또는 eigvalOption을 사용하여 대각 행렬에 고유값을 반환합니다.

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*D0에 가깝지만 정확히 0은 아닙니다.

기본적으로 eig는 항상 순서대로 정렬된 고유값과 고유벡터를 반환하지 않습니다. sort 함수를 사용하여 고유값을 오름차순으로 만들고 대응하는 고유벡터를 다시 정렬하십시오.

5x5 마방진 행렬의 고유값과 고유벡터를 계산합니다.

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의 두 번째 출력값은 인덱스의 치환 벡터를 반환합니다.

[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 = 1.2622e-29

3x3 행렬을 만듭니다.

 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에 가깝지만 정확히 0은 아닙니다.

3x3 행렬을 만듭니다.

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*V는 기껏해야 V*D에 근접할 수만 있습니다. 다시 말해서 A*V - V*D0에 가깝지만 정확히 0은 아닙니다.

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입니다.

기계 정밀도에 가까운 값을 포함하고 조건이 나쁜(Badly Conditioned) 대칭 행렬을 만듭니다.

format long e
A = diag([10^-16, 10^-15])
A = 2×2

     1.000000000000000e-16                         0
                         0     1.000000000000000e-15

디폴트 알고리즘을 사용하여 일반 고유값과 일련의 우고유벡터(Right Eigenvector)를 계산합니다. 이 경우 디폴트 알고리즘은 '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 알고리즘이 더 정확한 결과를 반환합니다.

2x2 단위 행렬 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가 가역 행렬이 아닌데도 일련의 고유벡터와 하나 이상의 실수 고유값을 반환합니다.

첫 번째 고유값과 첫 번째 고유벡터에 대해 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에 0이 아닌 정수는 물론 거의 0에 가까운 매우 작은 값이 포함되는 경우 밸런싱 단계는 작은 값을 스케일링하여 정수와 같은 유효한 값으로 만들고 부정확한 결과를 생성할 수 있습니다.

'balance'는 디폴트 동작입니다. 밸런싱에 대한 자세한 내용은 balance를 참조하십시오.

일반 고유값 알고리즘으로, 쌍의 일반 고유값을 계산하는 데 사용할 알고리즘 'chol' 또는 'qz'로 지정됩니다.

알고리즘설명
'chol'B의 촐레스키 분해(Cholesky Factorization)를 사용하여 AB의 일반 고유값을 계산합니다.
'qz'일반화된 슈어 분해(Schur Decomposition)라고도 하는 QZ 알고리즘을 사용합니다. 이 알고리즘은 AB의 대칭성을 무시합니다.

일반적으로 두 알고리즘은 동일한 결과를 반환합니다. QZ 알고리즘은 조건이 나쁜(Badly Conditioned) 행렬과 같은 특정 문제에 더욱 안정적일 수 있습니다.

algorithm 인수를 생략하면 eig 함수가 AB의 속성을 기반으로 알고리즘을 선택합니다. 이 함수는 대칭 (에르미트(Hermitian)) 행렬 A와 양의 정부호 대칭 (에르미트) 행렬 B'chol' 알고리즘을 사용합니다. 그 외의 경우 'qz' 알고리즘을 사용합니다.

지정하는 알고리즘에 상관없이 A 또는 B가 대칭 행렬이 아닌 경우 eig 함수는 항상 QZ 알고리즘을 사용합니다.

고유값 옵션으로, 'vector''matrix'로 지정됩니다. 이 옵션을 사용하면 고유값을 열 벡터로 반환할 것인지 아니면 대각 행렬로 반환할 것인지 여부를 지정할 수 있습니다. 디폴트 동작은 다음과 같이 지정된 출력값의 개수에 따라 달라집니다.

  • e = eig(A)와 같이 하나의 출력값을 지정한 경우 고유값은 기본적으로 열 벡터로 반환됩니다.

  • [V,D] = eig(A)와 같이 2~3개의 출력값을 지정한 경우 고유값은 기본적으로 대각 행렬 D로 반환됩니다.

예: D = eig(A,'matrix')는 출력값을 1개 가진 구문으로 고유값 대각 행렬을 반환합니다.

출력 인수

모두 축소

고유값으로, 중복도를 고려한 고유값(또는 쌍에 대해 일반 고유값)이 포함된 열 벡터로 반환됩니다.

A가 실수 행렬이면서 대칭 행렬이거나 복소수 에르미트 행렬일 때, Av = λv 방정식을 충족하는 e의 값은 실수입니다.

우고유벡터로, 각 열이 A의 우고유벡터이거나 (A,B) 쌍의 일반화된 우고유벡터인 정사각 행렬로 반환됩니다. V의 형식과 정규화는 다음과 같이 입력 인수의 조합에 따라 달라집니다.

  • [V,D] = eig(A)는 행렬 V를 반환합니다. 행렬의 각 열은 A*V = V*D를 충족하는 A의 우고유벡터입니다. V 내 고유벡터는 각각의 2-노름이 1이 되도록 정규화됩니다.

    A가 실수 대칭 행렬이면 우고유벡터 V는 정규 직교(Orthonormal)입니다.

  • [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에서 대칭(에르미트) 행렬 A와 양의 정부호 대칭(에르미트) 행렬 B로 구성된 'chol' 알고리즘을 사용하면, V에 있는 고유벡터를 정규화하므로, 각 고유벡터의 B-노름은 1입니다.

컴퓨터가 다르거나 MATLAB® 릴리스가 다르면, 같지는 않지만 수치적으로는 정확한 고유벡터가 생성될 수 있습니다.

  • 실수 고유벡터의 경우, 고유벡터의 기호가 달라질 수 있습니다.

  • 복소수 고유벡터의 경우, 크기가 1인 복소수와 고유벡터를 곱할 수 있습니다.

  • 중복 고유값의 경우, 일차 결합을 통해 고유벡터를 다시 결합할 수 있습니다. 예를 들어, Ax = λx이고 Ay = λy인 경우 A(x+y) = λ(x+y)이므로, x+y도 A의 고유벡터입니다.

고유값으로, A의 고유값 또는 중복도를 고려한 (A,B) 쌍의 고유값이 주대각선에 있는 대각 행렬로 반환됩니다.

A가 실수 행렬이면서 대칭 행렬이거나 복소수 에르미트 행렬일 때, Av = λv 방정식을 충족하는 D의 값은 실수입니다.

좌고유벡터(Left Eigenvector)로, 각 열이 A의 좌고유벡터(Left Eigenvector)이거나 (A,B) 쌍의 일반화된 좌고유벡터(Left Eigenvector)인 정사각 행렬로 반환됩니다. W의 형식과 정규화는 다음과 같이 입력 인수의 조합에 따라 달라집니다.

  • [V,D,W] = eig(A)는 행렬 W를 반환합니다. 이 행렬의 각 열은 A의 좌고유벡터(Left Eigenvector)이며 W'*A = D*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의 고유벡터입니다.

  • eig 함수는 실수 행렬이면서 대칭 행렬인 희소 행렬의 고유값을 계산할 수 있습니다. 희소 행렬의 고유벡터를 계산하거나, 실수 행렬이 아니거나 대칭 행렬이 아닌 희소 행렬의 고유값을 계산하려면 eigs 함수를 사용하십시오.

확장 기능

참고 항목

| | | | |

R2006a 이전에 개발됨