eigs
特征值和特征向量的子集
语法
说明
使用一个或多个名称-值对组参量指定其他选项。例如,d
= eigs(A
,k
,sigma
,Name,Value
)eigs(A,k,sigma,'Tolerance',1e-3)
将调整算法的收敛容差。
示例
矩阵 A = delsq(numgrid('C',15))
是一个对称正定矩阵,特征值合理分布在区间 (0 8) 中。计算模最大的六个特征值。
A = delsq(numgrid('C',15));
d = eigs(A)
d = 6×1
7.8666
7.7324
7.6531
7.5213
7.4480
7.3517
指定第二个输入,以计算特定数量的最大特征值。
d = eigs(A,3)
d = 3×1
7.8666
7.7324
7.6531
矩阵 A = delsq(numgrid('C',15))
是一个对称正定矩阵,特征值合理分布在区间 (0 8) 中。计算五个最小的特征值。
A = delsq(numgrid('C',15)); d = eigs(A,5,'smallestabs')
d = 5×1
0.1334
0.2676
0.3469
0.4787
0.5520
创建一个随机的 1500×1500 稀疏矩阵,非零元素的密度接近 25%。
n = 1500; A = sprand(n,n,0.25);
求矩阵的 LU 分解,将返回满足 A(p,:) = L*U
的置换向量 p
。
[L,U,p] = lu(A,'vector');
创建函数句柄 Afun
,它接受向量输入 x
并使用 LU 分解结果实际返回 A\x
。
Afun = @(x) U\(L\(x(p)));
使用带有函数句柄 Afun
的 eigs
计算六个模最小的特征值。第二个输入为 A
的大小。
d = eigs(Afun,1500,6,'smallestabs')
d = 6×1 complex
0.1423 + 0.0000i
0.4859 + 0.0000i
-0.3323 - 0.3881i
-0.3323 + 0.3881i
0.1019 - 0.5381i
0.1019 + 0.5381i
west0479
是一个带有实特征值和成对复共轭特征值的 479×479 实数值稀疏矩阵。
加载 west0479
矩阵,然后使用 eig
计算并绘制所有特征值。由于特征值为复数,plot
将自动使用实部作为 x 轴坐标,使用虚部作为 y 轴坐标。
load west0479 A = west0479; d = eig(full(A)); plot(d,'+')
特征值沿实线(x 轴)形成集群,距离原点特别近。
eigs
有多个适用于 sigma
的选项,可以挑选不同类型的最大或最小特征值。为 sigma
的每个可用选项计算并绘制一些特征值。
figure plot(d, '+') hold on la = eigs(A,6,'largestabs'); plot(la,'ro') sa = eigs(A,6,'smallestabs'); plot(sa,'go') hold off legend('All eigenvalues','Largest magnitude','Smallest magnitude') xlabel('Real axis') ylabel('Imaginary axis')
figure plot(d, '+') hold on ber = eigs(A,4,'bothendsreal'); plot(ber,'r^') bei = eigs(A,4,'bothendsimag'); plot(bei,'g^') hold off legend('All eigenvalues','Both ends real','Both ends imaginary') xlabel('Real axis') ylabel('Imaginary axis')
figure plot(d, '+') hold on lr = eigs(A,3,'largestreal'); plot(lr,'ro') sr = eigs(A,3,'smallestreal'); plot(sr,'go') li = eigs(A,3,'largestimag','SubspaceDimension',45); plot(li,'m^') si = eigs(A,3,'smallestimag','SubspaceDimension',45); plot(si,'c^') hold off legend('All eigenvalues','Largest real','Smallest real','Largest imaginary','Smallest imaginary') xlabel('Real axis') ylabel('Imaginary axis')
创建一个对称正定稀疏矩阵。
A = delsq(numgrid('C', 150));
使用 'smallestreal'
计算六个最小的实数特征值,它采用了使用 A
的克雷洛夫方法。
tic
d = eigs(A, 6, 'smallestreal')
d = 6×1
0.0013
0.0025
0.0033
0.0045
0.0052
0.0063
toc
Elapsed time is 1.518482 seconds.
使用 'smallestabs'
计算同样的特征值,它采用了使用 A
的倒数的克雷洛夫方法。
tic
dsm = eigs(A, 6, 'smallestabs')
dsm = 6×1
0.0013
0.0025
0.0033
0.0045
0.0052
0.0063
toc
Elapsed time is 0.275327 seconds.
特征值聚集在零附近。'smallestreal'
计算很难使用 A
进行收敛,因为特征值之间的差距非常小。相反,'smallestabs'
选项使用 A
的倒数,也就是 A
的特征值的倒数,它们的差距大得多,所以更容易计算。这种性能改进以分解 A
为代价,使用 'smallestreal'
则不需要进行分解。
计算几乎等于特征值的 sigma
数值附近的特征值。
矩阵 A = delsq(numgrid('C',30))
是一个大小为 632 的对称正定矩阵,特征值合理分布在区间 (0 8) 中,但是在 4.0 处有 18 个重复的特征值。要计算 4.0 附近的一些特征值,尝试函数调用 eigs(A,20,4.0)
是合理的。然而,此调用计算 A - 4.0*I
的逆矩阵的最大特征值,其中 I
是单位矩阵。由于 4.0 是 A
的特征值,此矩阵为奇异矩阵,因此没有逆矩阵。eigs
失败并生成错误消息。sigma
的数值不能精确等于特征值。必须使用接近但不等于 4.0 的 sigma
值来求这些特征值。
使用 eig
计算所有特征值,使用 eigs
计算 20 个最接近 4 - 1e-6 的特征值,然后比较结果。绘制按照每一种方法计算的特征值。
A = delsq(numgrid('C',30));
sigma = 4 - 1e-6;
d = eig(A);
D = sort(eigs(A,20,sigma));
plot(d(307:326),'ks') hold on plot(D,'k+') hold off legend('eig(A)','eigs(A,20,sigma)') title('18 Repeated Eigenvalues of A')
创建稀疏随机矩阵 A
和 B
,它们都具有低密度非零元素。
B = sprandn(1e3,1e3,0.001) + speye(1e3); B = B'*B; A = sprandn(1e3,1e3,0.005); A = A+A';
求矩阵 B
的乔列斯基分解,使用三个输出以返回置换向量 s
并测试值 p
。
[R,p,s] = chol(B,'vector');
p
p = 0
由于 p
为零,因此 B
是满足 B(s,s) = R'*R
的对称正定矩阵。
计算涉及 A
和 R
的广义特征值问题的六个模最大的特征值和特征向量。由于 R
是 B
的乔列斯基因子,请将 'IsCholesky'
指定为 true
。此外,由于 B(s,s) = R'*R
,因此 R = chol(B(s,s))
,所以应使用置换向量 s
作为 'CholeskyPermutation'
的值。
[V,D,flag] = eigs(A,R,6,'largestabs','IsCholesky',true,'CholeskyPermutation',s); flag
flag = 0
由于 flag
为零,所有特征值均已收敛。
输入参数
输入矩阵,指定为方阵。A
通常是(但不总是)一个大型稀疏矩阵。
如果 A
是对称矩阵,这种情况下 eigs
将使用专门的算法。如果 A
接近对称,则在调用 eigs
之前,可以考虑使用 A = (A+A')/2
使 A
对称。这样可以确保 eigs
计算的是实数特征值,而不是复数特征值。
数据类型: single
| double
复数支持: 是
输入矩阵,指定为大小与 A
相同的方阵。如果指定了 B
,eigs
可以解算广义特征值问题 A*V = B*V*D
。
如果 B
是对称正定矩阵,则 eigs
将使用专门针对该情况的算法。如果 B
接近对称正定矩阵,则在调用 eigs
之前,可以考虑使用 B = (B+B')/2
使 B
对称。
当 A
是标量时,您可以将 B
指定为空矩阵 eigs(A,[],k)
,以解算标准特征值问题并将 B
与 k
区分开。
数据类型: single
| double
复数支持: 是
要计算的特征值的数量,指定为正整数标量。如果 k
大于 size(A,2)
,则 eigs
改为使用最大有效值 k = size(A,2)
。
示例: eigs(A,2)
返回 A
的两个最大特征值。
特征值的类型,指定为下表中的值之一。
sigma | 描述 | sigma(R2017a 和之前的版本) |
---|---|---|
标量(实数或复数,包括 0) | 最接近数字 | 无变化 |
| 最大模。 | 'lm' |
| 最小模。与 | 'sm' |
| 最大实部。 | 'lr' , 'la' |
| 最小实部。 | 'sr' , 'sa' |
| 两个端点,有 | 'be' |
对于非对称问题,sigma
也可以是:
sigma | 描述 | sigma(R2017a 和之前的版本) |
---|---|---|
| 最大虚部。 | 'li' ,前提是 A 为复数。 |
| 最小虚部。 | 'si' ,前提是 A 为复数。 |
| 两个端点,有 | 如果 A 是实数,则为 'li' 。 |
示例: eigs(A,k,1)
返回最接近 1 的 k
个特征值。
示例: eigs(A,k,'smallestabs')
返回 k
个模最小的特征值。
数据类型: single
| double
| char
| string
Options 结构体,指定为包含下表中的一个或多个字段的结构体。
注意
不建议使用 options 结构体指定选项,而应使用名称-值对组。
选项字段 | 描述 | 名称-值对组 |
---|---|---|
issym |
| 'IsFunctionSymmetric' |
tol | 收敛容差。 | 'Tolerance' |
maxit | 最大迭代次数。 | 'MaxIterations' |
p | 兰佐斯基向量的数量。 | 'SubspaceDimension' |
v0 | 起始向量。 | 'StartVector' |
disp | 诊断信息的显示级别。 | 'Display' |
fail | 输出中未收敛的特征值的处理方式。 | 'FailureTreatment' |
spdB | B 是否为对称正定矩阵? | 'IsSymmetricDefinite' |
cholB |
| 'IsCholesky' |
permB | 如果稀疏矩阵 | 'CholeskyPermutation' |
示例: opts.issym = 1, opts.tol = 1e-10
将创建一个结构体,其中包含字段 issym
和 tol
的设置值。
数据类型: struct
矩阵函数,指定为函数句柄。函数 y = Afun(x)
必须返回正确的值,具体取决于 sigma
输入:
A*x
- 如果sigma
未指定或指定为'smallestabs'
之外的任何文本选项。A\x
- 如果sigma
是0
或'smallestabs'
。(A-sigma*I)\x
- 如果sigma
是非零标量(对于标准特征值问题)。(A-sigma*B)\x
- 如果sigma
是非零标量(对于广义特征值问题)。
例如,当使用 sigma = 'smallestabs'
调用 eigs
时,以下 Afun
有效:
[L,U,p] = lu(A,'vector'); Afun = @(x) U\(L\(x(p))); d = eigs(Afun,100,6,'smallestabs')
对于广义特征值问题,请按如下所示添加矩阵 B
(B
不能由函数句柄表示):
d = eigs(Afun,100,B,6,'smallestabs')
A
假定为不对称矩阵,除非 'IsFunctionSymmetric'
(或 opts.issym
)另有指定。将 'IsFunctionSymmetric'
设置为 true
可确保 eigs
计算的是实数特征值,而不是复数特征值。
有关如何为 Afun
函数提供其他参数的信息,请参阅参数化函数。
提示
在启用 'Display'
选项的情况下调用 eigs
可以查看 Afun
的预期输出。
Afun
表示的方阵 A
的大小,指定为正整数标量。
名称-值参数
以 Name1=Value1,...,NameN=ValueN
的形式指定可选参量对组,其中 Name
是参量名称,Value
是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: d = eigs(A,k,sigma,'Tolerance',1e-10,'MaxIterations',100)
放宽收敛容差并使用较少的迭代。
常规选项
收敛容差,以逗号分隔的对组形式指定,该对组由 'Tolerance'
和一个正实数数值标量组成。
示例: s = eigs(A,k,sigma,'Tolerance',1e-3)
算法的最大迭代次数,以逗号分隔的对组形式指定,该对组由 'MaxIterations'
和一个正整数组成。
示例: d = eigs(A,k,sigma,'MaxIterations',350)
克雷洛夫子空间的最大大小,以逗号分隔的对组形式指定,该对组由 'SubspaceDimension'
和一个非负整数组成。对于实数型对称问题,'SubspaceDimension'
值必须大于或等于 k + 1
,否则必须大于或等于 k + 2
,其中 k
是特征值的个数。
建议的值是 p >= 2*k
,对于实数型非对称问题,则为 p >= 2*k+1
。如果不指定 'SubspaceDimension'
值,则默认算法使用至少 20
个兰佐斯向量。
对于 eigs
不能收敛的问题,增大 'SubspaceDimension'
的值可以改善收敛行为。但是,值增加太多可能会导致内存问题。
示例: d = eigs(A,k,sigma,'SubspaceDimension',25)
初始起始向量,以逗号分隔的对组形式指定,该对组由 'StartVector'
和一个数值向量组成。
指定不同的随机起始向量主要是为了控制用于生成向量的随机数流。
注意
eigs
使用专用的随机数流以可再现的方式选择起始向量。更改随机数种子不会影响起始向量。
示例: d = eigs(A,k,sigma,'StartVector',randn(m,1))
使用从全局随机数流中获取值的随机起始向量。
数据类型: single
| double
未收敛的特征值的处理方式,以逗号分隔的对组形式指定,该对组由 'FailureTreatment'
和下列选项之一组成:'replacenan'
、'keep'
或 'drop'
。
'FailureTreatment'
的值决定 eigs
如何在输出中显示未收敛的特征值。
选项 | 对输出的影响 |
---|---|
| 将未收敛的特征值替换为 |
| 在输出中包括未收敛的特征值。 |
| 从输出中删除未收敛的特征值。此选项可能会使 |
示例: d = eigs(A,k,sigma,'FailureTreatment','drop')
将从输出中删除未收敛的特征值。
数据类型: char
| string
切换诊断信息的显示,以逗号分隔的对组形式指定,该对组由 'Display'
和一个数值或逻辑值 1
(true
) 或 0
(false
) 组成。指定值 true
或 1
可在计算期间打开诊断信息的显示。
Afun
的选项
Afun
矩阵的对称性,以逗号分隔的对组形式指定,该对组由 'IsFunctionSymmetric'
和一个数值或逻辑值 1
(true
) 或 0
(false
) 组成。
此选项指定对输入向量应用 Afun
的矩阵是否对称。可以指定值 true
或 1
,以指示 eigs
应使用专门的算法处理对称矩阵并返回实数特征值。
广义特征值问题 A*V = B*V*D
的选项
B
的乔列斯基分解标志,以逗号分隔的对组形式指定,该对组由 'IsCholesky'
和一个数值或逻辑值 1
(true
) 或 0
(false
) 组成。
此选项指定调用 eigs(A,B,___)
中矩阵 B
的输入是否确实是 R = chol(B)
生成的乔列斯基因子 R
。
注意
如果 sigma
是 'smallestabs'
或数值标量,请勿使用此选项。
乔列斯基置换向量,以逗号分隔的对组形式指定,该对组由 'CholeskyPermutation'
和一个数值向量组成。如果稀疏矩阵 B
在根据 chol(B(permB,permB))
进行因式分解之前进行了重新排序,则指定置换向量 permB
。
您也可以使用针对稀疏矩阵、有三个输出的 chol
语法,直接通过 [R,p,permB] = chol(B,'vector')
获取 permB
。
注意
如果 sigma
是 'smallestabs'
或数值标量,请勿使用此选项。
B
的对称正定标志,以逗号分隔的对组形式指定,该对组由 'IsSymmetricDefinite'
和一个数值或逻辑值 1
(true
) 或 0
(false
) 组成。如果您知道 B
是对称正定矩阵,即具有严格正特征值的对称矩阵,请指定 true
或 1
。
如果 B
是对称半正定矩阵(有些特征值为零),则将 'IsSymmetricDefinite'
指定为 true
或 1
可以强制 eigs
使用 B
为对称正定矩阵时使用的同一个专用算法。
注意
要使用此选项,sigma
的值必须为数值或 'smallestabs'
。
输出参量
特征值,以列向量形式返回。d
的排序方式因 sigma
值的不同而异。
| 输出排序 |
---|---|
| 按模降序排列 |
| 按实部降序排列 |
| 按虚部降序排列 |
| 按模升序排列 |
| 按实部升序排列 |
| 按虚部升序排列 |
| 按虚部的绝对值降序排列 |
特征向量,以矩阵形式返回。V
中的各列对应于沿 D
对角线方向的特征值。V
的形式和归一化取决于输入参量的组合:
[V,D] = eigs(A)
返回矩阵V
,其各列是A
的右特征向量,这样A*V = V*D
。V
中的特征向量已归一化,因此每个向量的 2-范数为 1。如果
A
为对称矩阵,则特征向量V
为正交矩阵。[V,D] = eigs(A,B)
返回矩阵V
,其中各列为满足A*V = B*V*D
的广义右特征向量。每个特征向量的 2-范数不一定为 1。如果
B
是对称正定矩阵,则V
中的特征向量是归一化向量,因此每个特征向量的B
-范数均为 1。如果A
也是对称矩阵,则特征向量与B
正交。
不同的计算机、MATLAB® 版本或参数(例如起始向量和子空间维度)可能生成不同的特征向量,它们在数值上依然精确:
对于实数特征向量,特征向量的符号可以更改。
对于复数特征向量,特征向量可以乘以模为 1 的任何复数。
对于多重特征值,其特征向量可以通过线性组合来重新组合。例如,如果 Ax = λx 且 Ay = λy,则 A(x+y) = λ(x+y),因此 x+y 也是 A 的一个特征向量。
特征值矩阵,以对角矩阵形式返回,包含主对角线上的特征值。
收敛标志,返回为 0
或 1
。值为 0
表示已收敛所有特征值。否则,表示并非所有特征值都已收敛。
使用此收敛标志输出可抑制收敛失败时的警告。
提示
eigs
使用专用的随机数流生成默认起始向量,以确保在不同运行之间的可再现性。调用eigs
之前使用rng
设置随机数生成器状态不会影响输出。要求出小型稠密矩阵的几个特征值,使用
eigs
并不是最有效的方式。对于这些问题,使用eig(full(A))
求解可能会更快。例如,求 500×500 矩阵的三个特征值相对容易,使用eig
即可轻松完成。对于某个给定矩阵,如果
eigs
无法收敛,可以通过增大'SubspaceDimension'
值来增加兰佐斯基向量的数量。作为备用方案,调整最大迭代次数'MaxIterations'
和收敛容差'Tolerance'
也有助于改善收敛行为。
参考
[1] Stewart, G.W. "A Krylov-Schur Algorithm for Large Eigenproblems." SIAM Journal of Matrix Analysis and Applications. Vol. 23, Issue 3, 2001, pp. 601–614.
[2] Lehoucq, R.B., D.C. Sorenson, and C. Yang. ARPACK Users' Guide. Philadelphia, PA: SIAM, 1998.
扩展功能
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2006a 之前推出您可以将以下参量指定为单精度:
A
、B
- 输入矩阵sigma
- 特征值的类型StartVector
- 初始起始向量
如果将 A
、B
或 StartVector
指定为单精度,函数将以单精度计算并返回 single
类型的输出。
如果仅指定矩阵函数 Afun
和矩阵大小 n
作为输入,eigs
的输出的精度与 Afun
的输出相同。如果还将 B
或 StartVector
指定为 single
,则 Afun
的输出也必须为 single
。
输出的排序顺序改变
eigs
现在根据sigma
的值对输出进行排序。例如,命令eigs(A,k,'largestabs')
生成按模降序排列的k
个特征值。以前,不能保证
eigs
生成的输出的排序顺序。可再现性
现在,连续多次调用
eigs
会产生相同的结果。将'StartVector'
设置为随机向量可更改此行为。显示
显示值
2
不再返回时间信息。eigs
将值2
视为与值1
相同。此外,'Display'
选项显示的消息也已发生变化。新消息显示每次迭代中的残差,而不是 Ritz 值。
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)