我使用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的想法,请告诉我。

最佳答案

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

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

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

另一方面,尝试
eigs(rand(1000), 10, 'lm'), and
eigs(rand(1000), 10, 'sm'),

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

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

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

编辑:关于此方法here有很多信息和引用,确切地理解为什么会发生这种情况的关键肯定包含在其中。

10-08 00:19