目录
语法
说明
示例
矩阵特征值
矩阵的特征值和特征向量
排序的特征值和特征向量
左特征向量
不可对角化(亏损)矩阵的特征值
广义特征值
病态矩阵使用 QZ 算法得出广义特征值
一个矩阵为奇异矩阵的广义特征值
eig函数的功能是求取矩阵特征值和特征向量。
语法
e = eig(A)
[V,D] = eig(A)
[V,D,W] = eig(A)
e = eig(A,B)
[V,D] = eig(A,B)
[V,D,W] = eig(A,B)
[___] = eig(A,balanceOption)
[___] = eig(A,B,algorithm)
[___] = eig(___,outputForm)
说明
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) 返回一个列向量,其中包含方阵 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 是 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 的默认值取决于 A 和 B 的属性,但通常是 'qz',表示使用 QZ 算法。
如果 A 为埃尔米特并且 B 为埃尔米特正定矩阵,则 algorithm 的默认值为 'chol'。
[___] = 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.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
使用 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 = 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.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) 计算矩阵 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 不可逆。
验证第一个特征值和第一个特征向量是否满足
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,本例中确实如此。
提示
-
eig 函数可以计算实数对称稀疏矩阵的特征值。要计算稀疏矩阵的特征向量或计算非实数对称稀疏矩阵的特征值,请使用 eigs 函数。