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
精确为零。
创建病态对称矩阵,其包含的值接近计算机精度。
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
,本例中确实如此。
输入参数
输入矩阵,指定为实方阵或复方阵。
数据类型: 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" | 使用 QZ 算法,亦称为广义舒尔分解。该算法忽略 A 和 B 的对称性。 |
总体上,两种算法返回相同的结果。QZ 算法对于某些问题更稳定,例如涉及到病态矩阵的问题。
无论您指定何种算法,当 A
或 B
为非对称矩阵时,eig
函数总使用 QZ 算法。
特征值的输出格式,指定为 "vector"
或 "matrix"
。此选项允许您指定是以列向量还是以对角矩阵返回特征值。默认行为根据指定的输出数目不同而不同:
如果指定一个输出,例如
e = eig(A)
,则在默认情况下,将以列向量的形式返回特征值。如果指定两个或三个输出,例如
[V,D] = eig(A)
,则在默认情况下,将以对角矩阵的形式D
返回特征值。
示例: D = eig(A,"matrix")
使用一个输出语法返回由特征值构成的一个对角矩阵。
输出参量
右特征向量,作为方阵返回,其各列为 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 的一个特征向量。
左特征向量,作为方阵返回,其各列为 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
函数。
扩展功能
用法说明和限制:
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 之前推出当输入包含非有限值(Inf
或 NaN
)时,eig
返回 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.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 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)