我使用eigs来计算稀疏方阵的特征向量,稀疏方阵很大(数万)。我想要的是最小的一组特征向量。但是
eigs(A, 10, 'sm') % Note: A is the matrix
运行非常慢。
然而,使用eigs(A,10,'lm')给我的答案相对更快。在我尝试的时候,用A替换了10
_
宽度在eigs(A,10,'lm'),所以这包括所有的特征向量,不能解决这个问题,因为这使得它和使用'sm‘一样慢。
所以,我想知道为什么计算最小向量(使用'sm')比计算最大向量慢得多?
顺便说一句,如果你有任何想法如何使用eigs与'sm‘一样快与'lm',请告诉我。
发布于 2013-03-26 19:49:41
因为
实际上是一个m文件函数,我们可以分析它。我已经运行了几个基本测试,这在很大程度上取决于矩阵中数据的性质。如果我们在以下两行代码中分别运行分析器:
eigs(eye(1000), 10, 'lm'), and
eigs(eye(1000), 10, 'sm'),
然后,在第一个实例中,它调用
(完成这项工作的主要函数-根据
可能是从
这里
)总共22次。在第二个实例中,它被调用103次。
另一方面,尝试使用
eigs(rand(1000), 10, 'lm'), and
eigs(rand(1000), 10, 'sm'),
我得到的结果是
选项始终调用
比起
选项。
恐怕我不知道算法的细节,所以不能从更深的数学意义上解释它,但我链接的页面表明ARPACK最适合于具有某种结构的矩阵。由于矩阵是由
几乎没有结构,因此可以安全地假设我描述的后一种行为不是您在正常操作条件下所期望的行为。
简而言之:当你要求一个结构化矩阵的最小特征值时,它只是需要更多的迭代才能收敛。然而,这是一个迭代过程,它在很大程度上取决于您提供的实际数据。
编辑:有大量关于此方法的信息和参考资料
这里
,而准确理解为什么会发生这种情况的关键肯定就包含在其中的某个地方。
发布于 2013-11-21 17:02:02
几乎所有标准中使用的算法
函数是(某些变体)
Lanczos算法
..。它是迭代的,第一次迭代会给出最大的特征值。这几乎解释了你所做的每一个观察:
最大的特征值需要最少的迭代次数,
最小的特征值需要最大的迭代次数,
所有特征值也采用最大迭代次数。
有一些技巧可以“欺骗”特征来计算最小的特征值,实际上使它们成为另一个问题的最大特征值。这通常是通过一个移位参数来完成的。略读
用于eigs的Matlab文档
,我看到他们有一个
参数,该参数可能会对您有所帮助。请注意,相同的文档建议使用适当的
如果矩阵可以放入内存中,则如下所示
有它的数字怪癖。
发布于 2015-09-10 14:48:40
原因实际上要简单得多,这是由于解决大型稀疏特征值问题的基础。这些都是基于解算的:
(1) A x = lam x
大多数求解方法都使用一些幂律(例如,在Lanczos和Arnoldi方法中都存在一个Krylov子空间)
问题是a幂级数收敛到(1)的最大特征值。因此,我们知道最大的特征值是由以下所跨越的子空间找到的:
,它只需要矩阵向量乘法(
便宜
)。
为了找到最小的,我们必须重写(1)如下:
(2) 1/lam x = A^(-1) x or A^(-1) x = invlam x
现在求解(2)的最大特征值等同于找到(1)的最小特征值。在这种情况下,子空间由
,这需要求解几个线性系统(
昂贵
!)。
https://stackoverflow.com/questions/15632002
复制相似问题