5

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

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

运行很慢。

但是,使用 eigs(A, 10, 'lm') 可以相对更快地给出答案。正如我尝试的那样,将 10 替换为 eigs(A, 10, 'lm') 中的 A_width 以便这包括所有特征向量,并不能解决这个问题,因为这使它与使用 'sm' 一样慢。

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

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

4

3 回答 3

7

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

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

有一些技巧可以通过实际使它们成为另一个问题的最大特征值来“欺骗” eigs 来计算最小的特征值。这通常通过移位参数来完成。浏览eigs的 Matlab 文档,我发现它们有一个sigma参数,这可能会对您有所帮助。eig请注意,如果矩阵适合内存,则相同的文档建议正确,因为eigs它的数字怪癖也是如此。

于 2013-11-21T09:02:02.217 回答
2

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

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

然后在第一个实例中,它总共调用了 22 次arpackc(完成工作的主要函数 - 根据其中的评论eigs可能来自这里)。在第二种情况下,它被调用了 103 次。

另一方面,尝试使用

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

我得到的结果是该'lm'选项持续调用arpackc的次数比该sm选项多很多。

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

简而言之:当您向算法询问结构化矩阵的最小特征值时,它只需进行更多次迭代即可收敛。这是一个迭代过程,但是,它在很大程度上取决于您提供的实际数据。

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

于 2013-03-26T11:49:41.493 回答
2

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

(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},这需要求解多个线性系统(昂贵!)。

于 2015-09-10T06:48:39.940 回答