为什么eigs('lm')比eigs('sm')快得多

Rob*_*ean 5 matlab matrix

我用eigs来计算稀疏平方矩阵的特征向量,这些矩阵是大的(数万).我想要的是最小的特征向量集.但

eigs(A, 10, 'sm')      % Note: A is the matrix
Run Code Online (Sandbox Code Playgroud)

跑得很慢.

然而,使用eigs(A,10,'lm')给我的答案相对更快.正如我所尝试的那样,在eigs(A,10,'lm')中用A_width替换10,这样就包含了所有的特征向量,并没有解决这个问题,因为这使得它与使用'sm'一样慢.

所以,我想知道为什么计算最小的向量(使用'sm')比计算最大的向量慢得多?

顺便说一句,如果您对如何使用'sm'和'lm'一样快地使用eigs有任何想法,请告诉我.

rub*_*nvb 5

几乎所有标准eigs函数中使用的算法都是Lanczos算法的(某些变体).它是迭代的,第一次迭代给出最大的特征值.这几乎解释了你所做的每一个观察:

  1. 最大的特征值占用最少的迭代次数,
  2. 最小的特征值占用最大迭代次数,
  3. 所有特征值也采用最大迭代量.

有些技巧可以通过实际使它们成为另一个问题的最大特征值来"愚弄"eigs来计算最小的特征值.这通常通过移位参数来完成.一掠而过了Matlab文档eigs,我看到他们有一个sigma参数,这可能会帮助你.请注意,eig如果矩阵适合内存,相同的文档建议正确,因为eigs它的数字怪癖.


wak*_*jah 2

由于eigs它实际上是一个 m 文件函数,因此我们可以对其进行分析。我已经运行了一些基本测试,这在很大程度上取决于矩阵中数据的性质。如果我们在以下两行代码上分别运行分析器:

eigs(eye(1000), 10, 'lm'), and
eigs(eye(1000), 10, 'sm'),
Run Code Online (Sandbox Code Playgroud)

然后在第一个实例中,它总共调用了 22 次arpackc(完成这项工作的主函数 - 根据eigs它中的注释可能来自此处)。在第二个实例中,它被调用了 103 次。

另一方面,尝试使用

eigs(rand(1000), 10, 'lm'), and
eigs(rand(1000), 10, 'sm'),
Run Code Online (Sandbox Code Playgroud)

我得到的结果是该'lm'选项始终比该选项调用arpackc更多次sm

恐怕我不知道该算法的细节,因此无法从更深入的数学意义上解释它,但我链接的页面表明 ARPACK 最适合具有某种结构的矩阵。由于 生成的矩阵rand几乎没有结构,因此可以安全地假设我描述的后一种行为不是您在正常操作条件下所期望的行为。

简而言之:当您要求算法提供结构化矩阵的最小特征值时,它只是需要更多迭代才能收敛。然而,这是一个迭代过程,它很大程度上取决于您提供的实际数据。

编辑:这里有大量关于此方法的信息和参考资料,并且准确理解为什么会发生这种情况的关键肯定包含在其中的某个地方。