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')
'smallestabs'
与 'smallestreal'
特征值之间的差
创建一个对称正定稀疏矩阵。
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.777706 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.257572 seconds.
特征值聚集在零附近。'smallestreal'
计算很难使用 A
进行收敛,因为特征值之间的差距非常小。相反,'smallestabs'
选项使用 A
的倒数,也就是 A
的特征值的倒数,它们的差距大得多,所以更容易计算。这种性能改进以分解 A
为代价,使用 'smallestreal'
则不需要进行分解。
接近特征值的 Sigma 值
计算几乎等于特征值的 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
通常是(但不总是)一个大型稀疏矩阵。
如果 A
是对称矩阵,这种情况下 eigs
将使用专门的算法。如果 A
接近对称,则在调用 eigs
之前,可以考虑使用 A = (A+A')/2
使 A
对称。这样可以确保 eigs
计算的是实数特征值,而不是复数特征值。
数据类型: double
复数支持: 是
B
— 输入矩阵
矩阵
输入矩阵,指定为大小与 A
相同的方阵。如果指定了 B
,eigs
可以解算广义特征值问题 A*V = B*V*D
。
如果 B
是对称正定矩阵,则 eigs
将使用专门针对该情况的算法。如果 B
接近对称正定矩阵,则在调用 eigs
之前,可以考虑使用 B = (B+B')/2
使 B
对称。
当 A
是标量时,您可以将 B
指定为空矩阵 eigs(A,[],k)
,以解算标准特征值问题并将 B
与 k
区分开。
数据类型: double
复数支持: 是
k
— 要计算的特征值的数量
标量
要计算的特征值的数量,指定为正整数标量。如果 k
大于 size(A,2)
,则 eigs
改为使用最大有效值 k = size(A,2)
。
示例: eigs(A,2)
返回 A
的两个最大特征值。
sigma
— 特征值的类型
'largestabs'
(默认) | 'smallestabs'
| 'largestreal'
| 'smallestreal'
| 'bothendsreal'
| 'largestimag'
| 'smallestimag'
| 'bothendsimag'
| 标量
特征值的类型,指定为下表中的值之一。
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
个模最小的特征值。
数据类型: double
| char
| string
opts
— Options 结构体
结构体
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
Afun
— 矩阵函数
函数句柄
矩阵函数,指定为函数句柄。函数 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
的预期输出。
n
— Afun
表示的方阵的大小
标量
Afun
表示的方阵 A
的大小,指定为正整数标量。
名称-值参数
将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参量名称,Value
是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: d = eigs(A,k,sigma,'Tolerance',1e-10,'MaxIterations',100)
放宽收敛容差并使用较少的迭代。
Tolerance
— 收敛容差
1e-14
(默认) | 正实数标量
收敛容差,以逗号分隔的对组形式指定,该对组由 'Tolerance'
和一个正实数数值标量组成。
示例: s = eigs(A,k,sigma,'Tolerance',1e-3)
MaxIterations
— 算法的最大迭代次数
300
(默认) | 正整数
算法的最大迭代次数,以逗号分隔的对组形式指定,该对组由 'MaxIterations'
和一个正整数组成。
示例: d = eigs(A,k,sigma,'MaxIterations',350)
SubspaceDimension
— 克雷洛夫子空间的最大大小
max(2*k,20)
(默认) | 非负整数
克雷洛夫子空间的最大大小,以逗号分隔的对组形式指定,该对组由 '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
— 初始起始向量
随机向量 (默认) | 向量
初始起始向量,以逗号分隔的对组形式指定,该对组由 'StartVector'
和一个数值向量组成。
指定不同的随机起始向量主要是为了控制用于生成向量的随机数流。
注意
eigs
使用专用的随机数流以可再现的方式选择起始向量。更改随机数种子不会影响起始向量。
示例: d = eigs(A,k,sigma,'StartVector',randn(m,1))
使用从全局随机数流中获取值的随机起始向量。
数据类型: double
FailureTreatment
— 未收敛的特征值的处理方式
'replacenan'
(默认) | 'keep'
| 'drop'
未收敛的特征值的处理方式,以逗号分隔的对组形式指定,该对组由 'FailureTreatment'
和下列选项之一组成:'replacenan'
、'keep'
或 'drop'
。
'FailureTreatment'
的值决定 eigs
如何在输出中显示未收敛的特征值。
选项 | 对输出的影响 |
---|---|
| 将未收敛的特征值替换为 |
| 在输出中包括未收敛的特征值。 |
| 从输出中删除未收敛的特征值。此选项可能会使 |
示例: d = eigs(A,k,sigma,'FailureTreatment','drop')
将从输出中删除未收敛的特征值。
数据类型: char
| string
Display
— 开启或关闭诊断信息的显示
false
或 0
(默认) | true
或 1
切换诊断信息的显示,以逗号分隔的对组形式指定,该对组由 'Display'
和一个数值或逻辑值 1
(true
) 或 0
(false
) 组成。指定值 true
或 1
可在计算期间打开诊断信息的显示。
Afun
的选项IsFunctionSymmetric
— Afun
矩阵的对称性
true
或 1
| false
或 0
Afun
矩阵的对称性,以逗号分隔的对组形式指定,该对组由 'IsFunctionSymmetric'
和一个数值或逻辑值 1
(true
) 或 0
(false
) 组成。
此选项指定对输入向量应用 Afun
的矩阵是否对称。可以指定值 true
或 1
,以指示 eigs
应使用专门的算法处理对称矩阵并返回实数特征值。
A*V = B*V*D
的选项IsCholesky
— B
的乔列斯基分解标志
true
或 1
| false
或 0
B
的乔列斯基分解标志,以逗号分隔的对组形式指定,该对组由 'IsCholesky'
和一个数值或逻辑值 1
(true
) 或 0
(false
) 组成。
此选项指定调用 eigs(A,B,___)
中矩阵 B
的输入是否确实是 R = chol(B)
生成的乔列斯基因子 R
。
注意
如果 sigma
是 'smallestabs'
或数值标量,请勿使用此选项。
CholeskyPermutation
— 乔列斯基置换向量
1:n
(默认) | 向量
乔列斯基置换向量,以逗号分隔的对组形式指定,该对组由 'CholeskyPermutation'
和一个数值向量组成。如果稀疏矩阵 B
在根据 chol(B(permB,permB))
进行因式分解之前进行了重新排序,则指定置换向量 permB
。
您也可以使用针对稀疏矩阵、有三个输出的 chol
语法,直接通过 [R,p,permB] = chol(B,'vector')
获取 permB
。
注意
如果 sigma
是 'smallestabs'
或数值标量,请勿使用此选项。
IsSymmetricDefinite
— B
的对称正定标志
true
或 1
| false
或 0
B
的对称正定标志,以逗号分隔的对组形式指定,该对组由 'IsSymmetricDefinite'
和一个数值或逻辑值 1
(true
) 或 0
(false
) 组成。如果您知道 B
是对称正定矩阵,即具有严格正特征值的对称矩阵,请指定 true
或 1
。
如果 B
是对称半正定矩阵(有些特征值为零),则将 'IsSymmetricDefinite'
指定为 true
或 1
可以强制 eigs
使用 B
为对称正定矩阵时使用的同一个专用算法。
注意
要使用此选项,sigma
的值必须为数值或 'smallestabs'
。
输出参量
d
— 特征值
列向量
特征值,以列向量形式返回。d
的排序方式因 sigma
值的不同而异。
| 输出排序 |
---|---|
| 按模降序排列 |
| 按实部降序排列 |
| 按虚部降序排列 |
| 按模升序排列 |
| 按实部升序排列 |
| 按虚部升序排列 |
| 按虚部的绝对值降序排列 |
V
— 特征向量
矩阵
特征向量,以矩阵形式返回。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 的一个特征向量。
D
— 特征值矩阵
矩阵
特征值矩阵,以对角矩阵形式返回,包含主对角线上的特征值。
flag
— 收敛标志
0
| 1
收敛标志,返回为 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® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
此函数完全支持分布式数组。有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出R2017b: 行为和算法改变
输出的排序顺序改变
eigs
现在根据sigma
的值对输出进行排序。例如,命令eigs(A,k,'largestabs')
生成按模降序排列的k
个特征值。以前,不能保证
eigs
生成的输出的排序顺序。可再现性
现在,连续多次调用
eigs
会产生相同的结果。将'StartVector'
设置为随机向量可更改此行为。显示
显示值
2
不再返回时间信息。eigs
将值2
视为与值1
相同。此外,'Display'
选项显示的消息也已发生变化。新消息显示每次迭代中的残差,而不是 Ritz 值。
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)