我有两个图,每个图都有近n〜100000个节点。在两个图中,每个节点正好连接到其他3个节点,因此邻接矩阵是对称的并且非常稀疏。
困难的部分是我需要邻接矩阵的所有特征值,而不是特征向量。准确地说,这将是我一生中唯一的一次(至少据我所知!),因此我想获取所有特征值,并且不介意等待几天来获取它们。
我尝试过scipy
包装器ARPACK
,但是花费的时间太长。我找到了多个库,但是它们最适合于获得最大/最小特征值的子集。是否有适用于对称稀疏矩阵并可能并行实现所有特征值的库?
我有两个图,每个图都有近n〜100000个节点。在两个图中,每个节点正好连接到其他3个节点,因此邻接矩阵是对称的并且非常稀疏。
困难的部分是我需要邻接矩阵的所有特征值,而不是特征向量。准确地说,这将是我一生中唯一的一次(至少据我所知!),因此我想获取所有特征值,并且不介意等待几天来获取它们。
我尝试过scipy
包装器ARPACK
,但是花费的时间太长。我找到了多个库,但是它们最适合于获得最大/最小特征值的子集。是否有适用于对称稀疏矩阵并可能并行实现所有特征值的库?
Answers:
您可以使用频移-反相频谱变换[1]并逐个频带计算频谱。
我的文章[2]中也解释了该技术。除了[1]中的实现外,我的Graphite软件[3]中还提供了C ++的实现(1月17日更新:现在所有内容都移植到了地理图/石墨版本3),该函数用于计算Laplace运算符的本征函数最多可与100万个顶点进行网格划分(与您的问题相似)。
怎么运行的:
这个想法是,如果是可逆的,则如果是本征对,是本征对。ARPACK中的迭代方法对于计算较大的特征值(高频)非常有效,而对于较小的特征值(较小的频率)而言效率较低。因此,当需要计算较小的频率时,将替换为是一个好主意。现在,由于ARPACK只需要计算矩阵向量乘积,就没有必要真正求反:可以将其分解(例如使用稀疏LU或稀疏分解),然后求解(V ,λ )甲(V ,1 / λ )甲- 1阿甲- 1甲大号大号吨甲X = b 甲- σ 我d σ (甲- σ 我d )- 1 σ每当ARPACK请求矩阵向量乘积时。这是“反转”转换。现在,当特征值的数量变大时,ARPACK会变慢,但是还有另一种技巧/变换可以使用,并且可以计算的特征值,其中是“移位”,它确定了哪个部分探索频谱的变化(这是“移位”变换)。结合这两种变换,可以计算一定数量的的特征值,然后通过增加逐频带探索整个频谱。细节在[1],[2]中。
[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