Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

eigs

特征值和特征向量的子集

说明

示例

d = eigs(A) 返回一个向量,其中包含矩阵 A 的六个模最大的特征值。当使用 eig 计算所有特征值的计算量很大时(例如对于大型稀疏矩阵来说),这是非常有用的。

示例

d = eigs(A,k) 返回 k 个模最大的特征值。

示例

d = eigs(A,k,sigma) 基于 sigma 的值返回 k 个特征值。例如,eigs(A,k,'smallestabs') 返回 k 个模最小的特征值。

d = eigs(A,k,sigma,Name,Value) 使用一个或多个名称-值对组参数指定其他选项。例如,eigs(A,k,sigma,'Tolerance',1e-3) 将调整算法的收敛容差。

示例

d = eigs(A,k,sigma,opts) 使用结构体指定选项。

示例

d = eigs(A,B,___) 解算广义特征值问题 A*V = B*V*D。您可以选择指定 ksigmaopts 或名称-值对组作为额外的输入参数。

d = eigs(Afun,n,___) 指定函数句柄 Afun,而不是矩阵。第二个输入 n 可求出 Afun 中使用的矩阵 A 的大小。您可以选择指定 Bksigmaopts 或名称-值对组作为额外的输入参数。

示例

[V,D] = eigs(___) 返回对角矩阵 D 和矩阵 V,前者包含主对角线上的特征值,后者的各列中包含对应的特征向量。您可以使用上述语法中的任何输入参数组合。

示例

[V,D,flag] = eigs(___) 也返回一个收敛标志。如果 flag0,则表示已收敛所有特征值。

示例

全部折叠

矩阵 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)));

使用带有函数句柄 Afuneigs 计算六个模最小的特征值。第二个输入为 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 的 Krylov 方法。

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 2.578327 seconds.

使用 'smallestabs' 计算同样的特征值,它采用了使用 A 的倒数的 Krylov 方法。

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.214678 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')

创建稀疏随机矩阵 AB,它们都具有低密度非零元素。

B = sprandn(1e3,1e3,0.001) + speye(1e3); 
B = B'*B; 
A = sprandn(1e3,1e3,0.005); 
A = A+A';

求矩阵 B 的 Cholesky 分解,使用三个输出以返回置换向量 s 并测试值 p

[R,p,s] = chol(B,'vector');
p
p = 0

由于 p 为零,因此 B 是满足 B(s,s) = R'*R 的对称正定矩阵。

计算涉及 AR 的广义特征值问题的六个模最大的特征值和特征向量。由于 RB 的 Cholesky 因子,请将 '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 计算的是实数特征值,而不是复数特征值。

数据类型: double
复数支持:

输入矩阵,指定为大小与 A 相同的方阵。如果指定了 Beigs 可以解算广义特征值问题 A*V = B*V*D

如果 B 是对称正定矩阵,则 eigs 将使用专门针对该情况的算法。如果 B 接近对称正定矩阵,则在调用 eigs 之前,可以考虑使用 B = (B+B')/2 使 B 对称。

A 是标量时,您可以将 B 指定为空矩阵 eigs(A,[],k),以解算标准特征值问题并将 Bk 区分开。

数据类型: double
复数支持:

要计算的特征值的数量,指定为正整数标量。

示例: eigs(A,2) 返回 A 的两个最大特征值。

特征值的类型,指定为下表中的值之一。

sigma

说明

sigma(R2017a 和之前的版本)

标量(实数或复数,包括 0)

最接近数字 sigma 的特征值。

无变化

'largestabs'(默认值)

最大模。

'lm'

'smallestabs'

最小模。与 sigma = 0 相同。

'sm'

'largestreal'

最大实部。

'lr''la'

'smallestreal'

最小实部。

'sr''sa'

'bothendsreal'

两个端点,有 k/2 个值分别具有最大实部和最小实部(如果 k 是奇数,则在大值端再选一个)。

'be'

对于非对称问题sigma 也可以是:

sigma

说明

sigma(R2017a 和之前的版本)

'largestimag'

最大虚部。

'li',前提是 A 为复数。

'smallestimag'

最小虚部。

'si',前提是 A 为复数。

'bothendsimag'

两个端点,有 k/2 个值分别具有最大虚部和最小虚部(如果 k 是奇数,则从大值端再选一个)。

如果 A 是实数,则为 'li'

示例: eigs(A,k,1) 返回最接近 1 的 k 个特征值。

示例: eigs(A,k,'smallestabs') 返回 k 个模最小的特征值。

数据类型: double | char | string

Options 结构体,指定为包含下表中的一个或多个字段的结构体。

注意

不建议使用 options 结构体指定选项,而应使用名称-值对组。

选项字段说明名称-值对组
issym

Afun 矩阵的对称性。

'IsFunctionSymmetric'
tol

收敛容差。

'Tolerance'
maxit

最大迭代次数。

'MaxIterations'
p

Lanczos 基向量的数量。

'SubspaceDimension'
v0

起始向量。

'StartVector'
disp

诊断信息的显示级别。

'Display'
fail输出中未收敛的特征值的处理方式。'FailureTreatment'
spdBB 是否为对称正定矩阵?'IsSymmetricDefinite'
cholB

B 是否为 Cholesky 因子 chol(B)

'IsCholesky'
permB

如果稀疏矩阵 B 确实是 chol(B(permB,permB)),请指定置换向量 permB

'CholeskyPermutation'

示例: opts.issym = 1, opts.tol = 1e-10 将创建一个结构体,并设置了字段 issymtol 的值。

数据类型: struct

矩阵函数,指定为函数句柄。函数 y = Afun(x) 必须返回正确的值,具体取决于 sigma 输入:

  • A*x - 如果 sigma 未指定或指定为 'smallestabs' 之外的任何文本选项。

  • A\x - 如果 sigma0'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')

对于广义特征值问题,请按如下所示添加矩阵 BB 不能由函数句柄表示):

d = eigs(Afun,100,B,6,'smallestabs')

A 假定为不对称矩阵,除非 'IsFunctionSymmetric'(或 opts.issym)另有指定。将 'IsFunctionSymmetric' 设置为 true 可确保 eigs 计算的是实数特征值,而不是复数特征值。

有关如何为 Afun 函数提供其他参数的信息,请参阅参数化函数

提示

在启用 'Display' 选项的情况下调用 eigs 可以查看 Afun 的预期输出。

Afun 表示的方阵 A 的大小,指定为正整数标量。

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: 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)

Krylov 子空间的最大大小,以逗号分隔的对组形式指定,该对组由 'SubspaceDimension' 和一个非负整数组成。对于实数型对称问题,'SubspaceDimension' 值必须大于或等于 k + 1,否则必须大于或等于 k + 2,其中 k 是特征值的个数。

建议的值是 p >= 2*k,对于实数型非对称问题,则为 p >= 2*k+1。如果不指定 'SubspaceDimension' 值,则默认算法使用至少 20 个 Lanczos 向量。

对于 eigs 不能收敛的问题,增加 'SubspaceDimension' 的值可以改善收敛行为。但是,值增加太多可能会导致内存问题。

示例: d = eigs(A,k,sigma,'SubspaceDimension',25)

初始起始向量,以逗号分隔的对组形式指定,该对组由 'StartVector' 和一个数值向量组成。

指定不同的随机起始向量主要是为了控制用于生成向量的随机数流。

注意

eigs 使用专用的随机数流以可再现的方式选择起始向量。更改随机数种子不会影响起始向量。

示例: d = eigs(A,k,sigma,'StartVector',randn(m,1)) 使用从全局随机数流中获取值的随机起始向量。

数据类型: double

未收敛的特征值的处理方式,以逗号分隔的对组形式指定,该对组由 'FailureTreatment' 和下列选项之一组成:'replacenan''keep''drop'

'FailureTreatment' 的值决定 eigs 如何在输出中显示未收敛的特征值。

选项

对输出的影响

'replacenan'

将未收敛的特征值替换为 NaN 值。

'keep'

在输出中包括未收敛的特征值。

'drop'

从输出中删除未收敛的特征值。此选项可能会使 eigs 返回的特征值少于请求的数量。

示例: d = eigs(A,k,sigma,'FailureTreatment','drop') 将从输出中删除未收敛的特征值。

数据类型: char | string

切换诊断信息的显示,以逗号分隔的对组形式指定,该对组由 'Display' 和一个数值或逻辑值 1 (true) 或 0 (false) 组成。指定值 true1 可在计算期间打开诊断信息的显示。

Afun 的选项

全部折叠

Afun 矩阵的对称性,以逗号分隔的对组形式指定,该对组由 'IsFunctionSymmetric' 和一个数值或逻辑值 1 (true) 或 0 (false) 组成。

此选项指定对输入向量应用 Afun 的矩阵是否对称。可以指定值 true1,以指示 eigs 应使用专门的算法处理对称矩阵并返回实数特征值。

广义特征值问题 A*V = B*V*D 的选项

全部折叠

B 的 Cholesky 分解标志,以逗号分隔的对组形式指定,该对组由 'IsCholesky' 和一个数值或逻辑值 1 (true) 或 0 (false) 组成。

此选项指定调用 eigs(A,B,___) 中矩阵 B 的输入是否确实是 R = chol(B) 生成的 Cholesky 因子 R

注意

如果 sigma'smallestabs' 或数值标量,请勿使用此选项。

Cholesky 置换向量,以逗号分隔的对组形式指定,该对组由 'CholeskyPermutation' 和一个数值向量组成。如果稀疏矩阵 B 在根据 chol(B(permB,permB)) 进行因式分解之前进行了重新排序,则指定置换向量 permB

您也可以使用针对稀疏矩阵、有三个输出的 chol 语法,直接通过 [R,p,permB] = chol(B,'vector') 获取 permB

注意

如果 sigma'smallestabs' 或数值标量,请勿使用此选项。

B 的对称正定标志,以逗号分隔的对组形式指定,该对组由 'IsSymmetricDefinite' 和一个数值或逻辑值 1 (true) 或 0 (false) 组成。如果您知道 B 是对称正定矩阵,即具有严格正特征值的对称矩阵,请指定 true1

如果 B 是对称半正定矩阵(有些特征值为零),则将 'IsSymmetricDefinite' 指定为 true1 可以强制 eigs 使用 B 为对称正定矩阵时使用的同一个专用算法。

注意

要使用此选项,sigma 的值必须为数值或 'smallestabs'

输出参数

全部折叠

特征值,以列向量形式返回。d 的排序方式因 sigma 值的不同而异。

sigma 的值

输出排序

'largestabs'

按模降序排列

'largestreal'

按实部降序排列

'largestimag'

按虚部降序排列

'smallestabs'

按模升序排列

'smallestreal'

'bothendsreal'

按实部升序排列

'smallestimag'

按虚部升序排列

'bothendsimag'

按虚部的绝对值降序排列

特征向量,以矩阵形式返回。V 中的各列对应于沿 D 对角线方向的特征值。V 的形式和归一化取决于输入参数的组合:

  • [V,D] = eigs(A) 返回矩阵 V,它的各列是 A 的特征向量,因此 A*V = V*DV 中的特征向量已归一化,因此每个向量的 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 = λxAy = λy,则 A(x+y) = λ(x+y),因此 x+y 也是 A 的一个特征向量。

特征值矩阵,以对角矩阵形式返回,包含主对角线上的特征值。

收敛标志,返回为 01。值为 0 表示已收敛所有特征值。否则,表示并非所有特征值都已收敛。

使用此收敛标志输出可抑制收敛失败时的警告。

提示

  • eigs 使用专用的随机数流生成默认起始向量,以确保在不同运行之间的可再现性。调用 eigs 之前使用 rng 设置随机数生成器状态不会影响输出。

  • 要求出小型稠密矩阵的几个特征值,使用 eigs 并不是最有效的方式。对于这些问题,使用 eig(full(A)) 求解可能会更快。例如,求 500×500 矩阵的三个特征值相对容易,使用 eig 即可轻松完成。

  • 对于某个给定矩阵,如果 eigs 无法收敛,可以通过增大 'SubspaceDimension' 值来增加 Lanczos 基向量的数量。作为备用方案,调整最大迭代次数 'MaxIterations' 和收敛容差 'Tolerance' 也有助于改善收敛行为。

兼容性考虑

全部展开

R2017b 中的行为有变化

参考

[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.

扩展功能

另请参阅

|

在 R2006a 之前推出