计算一个非常大且非常稀疏的邻接矩阵的所有特征值


13

我有两个图,每个图都有近n〜100000个节点。在两个图中,每个节点正好连接到其他3个节点,因此邻接矩阵是对称的并且非常稀疏。

困难的部分是我需要邻接矩阵的所有特征值,而不是特征向量。准确地说,这将是我一生中唯一的一次(至少据我所知!),因此我想获取所有特征值,并且不介意等待几天来获取它们。

我尝试过scipy包装器ARPACK,但是花费的时间太长。我找到了多个库,但是它们最适合于获得最大/最小特征值的子集。是否有适用于对称稀疏矩阵并可能并行实现所有特征值的库?


6
出于好奇,为什么您确实需要所有特征值?这种大小的大多数问题都是甚至更大(甚至是无限维)问题的近似值,因此,小问题的特征值仅近似于一个人真正想要解决的问题的特征值。大多数情况下,近似值的质量仅对最小或最大特征值有效,而其他所有值的近似值均较差,因此没有太大的实际意义。
Wolfgang Bangerth '16


@WolfgangBangerth:(如果这些对您来说很明显,请原谅我)问题出在材料物理上。它与材料的紧密结合近似有关,以获得带结构,振动和电学性质。为了获得这些,我需要所有特征值。顺便说一句,这并不是什么新鲜事物,它可以追溯到70年代和80年代,但是由于我的系统是非晶态的,因此我需要有一个非常大的系统才能获得良好的效果。尽管大多数人只关心晶体,但是与我的案例相比,这非常容易。
Mahdi 2016年

2
@Mahdi:嗯,我的意思是物理性质由某些偏微分算子的频谱确定。我怀疑(但是当然不知道,因为您没有描述问题的出处)您所拥有的大矩阵特征值问题只是PDE问题的一个近似值。因此,您的特征值仅是近似值。
Wolfgang Bangerth '16

Answers:


8

您可以使用频移-反相频谱变换[1]并逐个频带计算频谱。

我的文章[2]中也解释了该技术。除了[1]中的实现外,我的Graphite软件[3]中还提供了C ++的实现1月17日更新:现在所有内容都移植到了地理图/石墨版本3),该函数用于计算Laplace运算符的本征函数最多可与100万个顶点进行网格划分(与您的问题相似)。

怎么运行的:

这个想法是,如果是可逆的,则如果是本征对,是本征对。ARPACK中的迭代方法对于计算较大的特征值(高频)非常有效,而对于较小的特征值(较小的频率)而言效率较低。因此,当需要计算较小的频率时,将替换为是一个好主意。现在,由于ARPACK只需要计算矩阵向量乘积,就没有必要真正求反:可以将其分解(例如使用稀疏LU或稀疏分解),然后求解V λ V 1 / λ - 1- 1大号大号X = b - σ d σ - σ d - 1 σA(V,λ)A(V,1/λ)A1AA1ALLtAx=b每当ARPACK请求矩阵向量乘积时。这是“反转”转换。现在,当特征值的数量变大时,ARPACK会变慢,但是还有另一种技巧/变换可以使用,并且可以计算的特征值,其中是“移位”,它确定了哪个部分探索频谱的变化(这是“移位”变换)。结合这两种变换,可以计算一定数量的的特征值,然后通过增加逐频带探索整个频谱。细节在[1],[2]中。AσIdσ(AσId)1σ

[1] http://www.mcs.anl.gov/uploads/cels/papers/P1263.pdf

[2] http://alice.loria.fr/index.php/publications.html?redirect=0&Paper=ManifoldHarmonics@2008

[3] http://alice.loria.fr/software/graphite/doc/html/


谢谢布鲁诺!这些看起来很有希望,我会研究它们!
Mahdi

1

另一个选择是使用Jacobi旋转。由于矩阵已经几乎是对角线的,因此收敛不需要花费太多时间。通常,它以线性速率收敛,但是经过足够的迭代后,收敛速率变为二次方。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.