本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

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 是 n×n 矩阵,v 是长度 n 的列向量,λ 是标量。满足方程的 λ 的值即特征值。满足方程的 v 的对应值即右特征向量。左特征向量 w 满足方程 w’A = λw’。

示例

e = eig(A,B) 返回一个列向量,其中包含方阵 AB 的广义特征值。

示例

[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 是 n×n 矩阵,v 是长度 n 的列向量,λ 是标量。满足方程的 λ 的值即广义特征值。对应的 v 的值即广义右特征向量。左特征向量 w 满足方程 w’A = λw’B。

[___] = eig(A,balanceOption)(其中,balanceOption'nobalance')禁用该算法中的初始均衡步骤。balanceOption 的默认值是 'balance',表示启用均衡步骤。eig 函数可以返回先前语法中的任何输出参数。

示例

[___] = eig(A,B,algorithm)(其中,algorithm'chol')使用 B 的 Cholesky 分解计算广义特征值。algorithm 的默认值取决于 AB 的属性,但通常是 'qz',表示使用 QZ 算法。

如果 A 为 Hermitian 并且 B 为 Hermitian 正定矩阵,则 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.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.2220 + 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.1110 + 0.0666i  -0.1110 - 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 的第二个输出返回索引的置换向量。

[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

使用 indD 的对角线元素进行重新排序。由于 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

创建一个 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 为亏损矩阵,仍验证 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*D 接近但不等于 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 精确为零。

创建病态对称矩阵,其包含的值接近计算机精度。

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 的广义特征值,则 MATLAB® 会返回错误,因为 B\A 会生成 Inf 值。

在这种情况下,应将上述两个矩阵传递给 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
复数支持:

广义特征值问题输入矩阵,指定为实数值或复数值方阵。B 必须与 A 具有相同的大小。

数据类型: double | single
复数支持:

均衡选项,指定为 'balance'(启用初始均衡步骤)或 'nobalance'(禁用初始均衡步骤)。在大多数情况下,均衡步骤可改善 A 的状况以获得更精确的结果。但是,在有些情况下均衡会导致不正确的结果。当 A 包含的值大小差距较大时,请指定 'nobalance'。例如,如果 A 包含非零整数,以及非常小(接近零)的值,那么均衡步长可能将较小值放大到与整数相当的大小,从而导致不精确结果。

'balance' 为默认行为。有关平衡的详细信息,请参阅 balance

广义特征值算法,指定为 'chol''qz',用于选择计算对组的广义特征值时所使用的算法。

算法说明
'chol'使用 B 的 Cholesky 分解计算 AB 的广义特征值。
'qz'使用 QZ 算法,亦称为广义 Schur 分解。该算法忽略 AB 的对称性。

总体上,两种算法返回相同的结果。QZ 算法对于某些问题更稳定,例如涉及到病态矩阵的问题。

忽略 algorithm 参数时,eig 函数将根据 AB 的属性选择一种算法。对于对称 (Hermitian) A 和对称 (Hermitian) 正定 B,将使用 'chol' 算法。否则,将使用 'qz' 算法。

无论您指定何种算法,当 AB 为非对称矩阵时,eig 函数总使用 QZ 算法。

特征值选项,指定为 'vector''matrix'。此选项允许您指定是以列向量还是以对角矩阵返回特征值。默认行为根据指定的输出数不同而不同:

  • 如果指定一个输出,例如 e = eig(A),则在默认情况下,将以列向量的形式返回特征值。

  • 如果指定两个或三个输出,例如 [V,D] = eig(A),则在默认情况下,将以对角矩阵的形式 D 返回特征值。

示例: D = eig(A,'matrix') 使用一个输出语法返回由特征值构成的一个对角矩阵。

输出参数

全部折叠

特征值,以包含特征值(或对组的广义特征值)的列向量及重数的形式返回。

A 为实数对称或复数 Hermitian 矩阵时,满足 Av = λv 的 e 值为实数。

右特征向量,作为方阵返回,其各列为 A 的右特征向量或对组 (A,B) 的广义右特征向量。V 的形式和归一化取决于输入参数的组合:

  • [V,D] = eig(A) 返回矩阵 V,其各列是 A 的右特征向量,这样 A*V = V*DV 中的特征向量已归一化,因此每个向量的 2-范数为 1。

    如果 A 为实数对称矩阵,则右特征向量 V 为正交。

  • [V,D] = eig(A,'nobalance') 还返回矩阵 V。但是,每个特征向量的 2-范数不一定为 1。

  • [V,D] = eig(A,B)[V,D] = eig(A,B,algorithm) 返回矩阵 V,其中各列为满足 A*V = B*V*D 的广义右特征向量。每个特征向量的 2-范数不一定为 1。在本例中,D 的主对角线包含对组 (A,B) 的各广义特征值。

    eig 使用 'chol' 算法计算对称 (Hermitian) 矩阵 A 和对称 (Hermitian) 正定矩阵 B 时,它会将 V 中的特征向量归一化,使每个特征向量的 B-范数均为 1。

不同的计算机和 MATLAB® 版本可能生成不同的特征向量,它们在数值上依然精确:

  • 对于实数特征向量,特征向量的符号可以更改。

  • 对于复数特征向量,特征向量可以乘以模为 1 的任何复数。

  • 对于多重特征值,其特征向量可以通过线性组合来重新组合。例如,如果 Ax = λxAy = λy,则 A(x+y) = λ(x+y),因此 x+y 也是 A 的一个特征向量。

特征值,以包含 A 在主对角线上的特征值或对组 (A,B) 在主对角线上的特征值(有重数)的对角矩阵的形式返回。

A 为实数对称或复数 Hermitian 矩阵时,满足 Av = λv 的 D 值为实数。

左特征向量,作为方阵返回,其各列为 A 的左特征向量或对组 (A,B) 的广义左特征向量。W 的形式和归一化取决于输入参数的组合:

  • [V,D,W] = eig(A) 返回矩阵 W,其各列是 A 的左特征向量,这样 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,其中各列为满足 W'*A = D*W'*B 的广义左特征向量。每个特征向量的 2-范数不一定为 1。在本例中,D 的主对角线包含对组 (A,B) 的各广义特征值。

    如果 AB 是对称矩阵,则 WV 相同。

不同的计算机和 MATLAB 版本可能生成不同的特征向量,它们在数值上依然精确:

  • 对于实数特征向量,特征向量的符号可以更改。

  • 对于复数特征向量,特征向量可以乘以模为 1 的任何复数。

  • 对于多重特征值,其特征向量可以通过线性组合来重新组合。例如,如果 Ax = λxAy = λy,则 A(x+y) = λ(x+y),因此 x+y 也是 A 的一个特征向量。

提示

  • eig 函数可以计算实数对称稀疏矩阵的特征值。要计算稀疏矩阵的特征向量或计算非实数对称稀疏矩阵的特征值,请使用 eigs 函数。

扩展功能

另请参阅

| | | | |

在 R2006a 之前推出