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
的第二个输出返回索引的置换向量。
[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
。
广义特征值
创建两个矩阵(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
精确为零。
病态矩阵使用 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)
计算矩阵 的广义特征值,则 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
不可逆。
验证第一个特征值和第一个特征向量是否满足 。
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 的广义特征值。如果 A 不是对称(埃尔米特)矩阵或者如果 B 不是对称(埃尔米特)正定矩阵,则 eig 改用 QZ 算法。 |
"qz" | 使用 QZ 算法,亦称为广义舒尔分解。该算法忽略 A 和 B 的对称性。 |
总体上,两种算法返回相同的结果。QZ 算法对于某些问题更稳定,例如涉及到病态矩阵的问题。
无论您指定何种算法,当 A
或 B
为非对称矩阵时,eig
函数总使用 QZ 算法。
outputForm
— 特征值的输出格式
"vector"
| "matrix"
特征值的输出格式,指定为 "vector"
或 "matrix"
。此选项允许您指定是以列向量还是以对角矩阵返回特征值。默认行为根据指定的输出数不同而不同:
如果指定一个输出,例如
e = eig(A)
,则在默认情况下,将以列向量的形式返回特征值。如果指定两个或三个输出,例如
[V,D] = eig(A)
,则在默认情况下,将以对角矩阵的形式D
返回特征值。
示例: D = eig(A,"matrix")
使用一个输出语法返回由特征值构成的一个对角矩阵。
输出参量
V
— 右特征向量
方阵
右特征向量,作为方阵返回,其各列为 A
的右特征向量或对组 (A,B)
的广义右特征向量。V
的形式和归一化取决于输入参量的组合:
[V,D] = eig(A)
返回矩阵V
,其各列是A
的右特征向量,这样A*V = V*D
。V
中的特征向量已归一化,因此每个向量的 2-范数为 1。[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"
算法计算对称(埃尔米特)矩阵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
的左特征向量,这样W'*A = D*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
,其中各列为满足W'*A = D*W'*B
的广义左特征向量。每个特征向量的 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")
。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
用法说明和限制:
对于一般情况,
eig(A,B)
、A
和B
必须是实对称矩阵或 埃尔米特复矩阵。此外,B
必须为正定矩阵。不支持对分布式满数组使用以下语法:
[__] = eig(A,B,"qz")
[V,D,W] = eig(A,B)
有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出R2021b: eig
在输入为非有限时返回 NaN
当输入包含非有限值(Inf
或 NaN
)时,eig
返回 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)