当前位置: 首页 > news >正文

MATLAB中eig函数用法

目录

语法

说明

示例

矩阵特征值

矩阵的特征值和特征向量

排序的特征值和特征向量

左特征向量

不可对角化(亏损)矩阵的特征值

广义特征值

病态矩阵使用 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×41.0000    0.5000    0.3333    0.25000.5000    1.0000    0.6667    0.50000.3333    0.6667    1.0000    0.75000.2500    0.5000    0.7500    1.0000

        计算 A 的特征值。结果为一个列向量。

e = eig(A)
e = 4×10.20780.40780.84822.5362

        或者,使用 outputForm 返回对角矩阵中的特征值。

D = eig(A,'matrix')
D = 4×40.2078         0         0         00    0.4078         0         00         0    0.8482         00         0         0    2.5362

矩阵的特征值和特征向量

        使用 gallery 创建循环矩阵。

A = gallery('circul',3)
A = 3×31     2     33     1     22     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.5000iD = 3×3 complex6.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i0.0000 + 0.0000i  -1.5000 + 0.8660i   0.0000 + 0.0000i0.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.0111i0.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×517    24     1     8    1523     5     7    14    164     6    13    20    2210    12    19    21     311    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.6330D = 5×565.0000         0         0         0         00  -21.2768         0         0         00         0  -13.1263         0         00         0         0   21.2768         00         0         0         0   13.1263

        A 的特征值位于 D 的对角线上。但是,特征值并未排序。

        使用 diag(D) 从 D 的对角线上提取特征值,然后按升序对得到的向量进行排序。sort 的第二个输出返回索引的置换向量。

[d,ind] = sort(diag(D))
d = 5×1-21.2768-13.126313.126321.276865.0000ind = 5×123541

        使用 ind 对 D 的对角线元素进行重新排序。由于 D 中的特征值对应于 V 的各列中的特征向量,因此还必须使用相同的索引对 V 的列进行重新排序。

Ds = D(ind,ind)
Ds = 5×5-21.2768         0         0         0         00  -13.1263         0         0         00         0   13.1263         0         00         0         0   21.2768         00         0         0         0   65.0000Vs = V(:,ind)
Vs = 5×50.0976   -0.6330   -0.2619    0.6780   -0.44720.3525    0.5895   -0.1732    0.3223   -0.44720.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.7912D = 3×325.5548         0         00   -0.5789         00         0   -7.9759W = 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.03330    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×31.0000   -1.0000    1.00000    0.0000   -0.00000         0    0.0000D = 3×33     0     00     3     00     0     3

        A 包含重复特征值,且特征向量非独立。这意味着 A 不可对角化,因此为亏损矩阵。

        尽管 A 为亏损矩阵,仍验证 V 和 D 是否满足方程 A*V = V*D。

A*V - V*D
ans = 3×3
10-15 ×0    0.8882   -0.88820         0    0.00000         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 complex1.0000 + 0.0000i   1.0000 + 0.0000i0.0000 - 0.7071i   0.0000 + 0.7071iD = 2×2 complex0.0000 + 1.0000i   0.0000 + 0.0000i0.0000 + 0.0000i   0.0000 - 1.0000i

        验证结果是否满足 A*V = B*V*D。

A*V - B*V*D
ans = 2×20     00     0

残差 A*V - B*V*D 精确为零。

病态矩阵使用 QZ 算法得出广义特征值

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

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

        使用默认算法计算广义特征值和一组右特征向量。在这种情况下,默认算法为 'chol'。

[V1,D1] = eig(A,A)
V1 = 2×21.000000000000000e+08                         00     3.162277660168380e+07D1 = 2×29.999999999999999e-01                         00     1.000000000000000e+00

现在,使用 'qz' 算法计算广义特征值和一组右特征向量。

[V2,D2] = eig(A,A,'qz')
V2 = 2×21     00     1D2 = 2×21     00     1

        检查 'chol' 结果满足 A*V1 = A*V1*D1 的程度。

format short
A*V1 - A*V1*D1
ans = 2×2
10-23 ×0.1654         00   -0.6617

        现在,检查 'qz' 结果满足 A*V2 = A*V2*D2 的程度。

A*V2 - A*V2*D2
ans = 2×20     00     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.5000D = 2×20.0909         00       Inf

        最好是分开传递两个矩阵,并让 eig 选择求解该问题的最佳算法。在这种情况下,eig(A,B) 会返回一组特征向量和至少一个实数特征值,尽管 B 不可逆。

        验证第一个特征值和第一个特征向量是否满足 

eigval = D(1,1);
eigvec = V(:,1);
A*eigvec - eigval*B*eigvec
ans = 2×1
10-15 ×0.11100.2220

        在理想情况下,特征值分解可满足此关系。由于分解是使用浮点计算完成的,那么 A*eigvec 可最大程度接近 eigval*B*eigvec,本例中确实如此。

提示

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

http://www.lryc.cn/news/479435.html

相关文章:

  • Chrome(谷歌浏览器中文版)下载安装(Windows 11)
  • Linux 配置JDK
  • 目前主流的人工智能学习框架有哪些?
  • 100种算法【Python版】第57篇——贝叶斯优化算法
  • 在Ubuntu 上实现 JAR 包的自启动
  • 【智能算法应用】哈里斯鹰算法优化二维栅格路径规划问题
  • 单品年销10亿!看麻辣王子是如何布局软文营销为品牌赋能的?
  • 【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
  • C++:模拟实现STL的string
  • 【Python TensorFlow】入门到精通
  • 数据结构:七种排序及总结
  • 【安当产品应用案例100集】030-使用企业微信登录Windows,实现工作电脑与业务系统登录方式统一
  • 大数据数据存储层MemSQL, HBase与HDFS
  • 【HarmonyOS】鸿蒙应用设置控件通用样式AttributeModifier, @Styles
  • Scala IF...ELSE 语句
  • 快速上手vue3+js+Node.js
  • 06 网络编程基础
  • Python 的 FastApi 如何在request 重复取request.body()
  • qt QFontDialog详解
  • AI时代,通才可能会占据更有利的地位
  • qt QHeaderView详解
  • 探索PickleDB:Python中的轻量级数据存储利器
  • yocto下编译perf失败的解决方法
  • 丹摩征文活动|详解 DAMODEL(丹摩智算)平台:为 AI 开发者量身打造的智算云服务
  • ORACLE _11G_R2_ASM 常用命令
  • 掌握Rust模式匹配:从基础语法到实际应用
  • HFSS 3D Layout中Design setting各个选项的解释
  • 线性表之链表详解
  • C/C++使用AddressSanitizer检测内存错误
  • 【EI和Scopus检索】国际人工智能创新研讨会(IS-AII 2025)