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

时间:2013-03-26 07:56:17

标签: matlab matrix

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

eigs(A, 10, 'sm')      % Note: A is the matrix

跑得很慢。

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

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

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

3 个答案:

答案 0 :(得分:5)

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

  1. 最大的特征值占用最少的迭代次数,
  2. 最小的特征值占用最大迭代次数,
  3. 所有特征值也需要最大迭代次数。
  4. 通过实际使它们成为另一个问题的最大特征值,有一些技巧可以“愚弄”eigs计算最小特征值。这通常通过移位参数来完成。略过the Matlab documentation for eigs,我发现他们有一个sigma参数,可能会对您有所帮助。请注意,如果矩阵适合内存,相同的文档建议正确eig,因为eigs有其数字怪癖。

答案 1 :(得分:2)

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

eigs(eye(1000), 10, 'lm'), and
eigs(eye(1000), 10, 'sm'),

然后在第一个实例中它调用arpackc(执行工作的主要功能 - 根据eigs中的注释,它可能来自here)总共22次。在第二个例子中,它被称为103次。

另一方面,尝试

eigs(rand(1000), 10, 'lm'), and
eigs(rand(1000), 10, 'sm'),

我得到的结果是'lm'选项始终调用arpackc的次数比sm选项多一倍。

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

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

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

答案 2 :(得分:1)

原因实际上更简单,并且由于解决大的稀疏特征值问题的基础知识。这些都是基于解决:

(1) A x = lam x

大多数求解方法都使用一些幂律(例如,在Lanczos和Arnoldi方法中都使用Krylov子空间)

问题是a幂级数收敛于(1)的最大特征值。因此,我们得到的最大特征值是由K^k = {A*r0,....,A^k*r0}所跨越的子空间找到的,它只需要矩阵向量乘法(便宜)。

为了找到最小的,我们必须重新制定(1)如下:

(2) 1/lam x = A^(-1) x or A^(-1) x = invlam x  

现在求解(2)的最大特征值相当于找到(1)的最小特征值。在这种情况下,子空间由K^k = {A^(-1)*r0,....,A^(-k)*r0}跨越,这需要求解几个线性系统(昂贵的!)。

希望这个