当我尝试计算a very large graph的邻接矩阵的特征值时,我得到了什么,可以被称为“垃圾”。特别是,由于图是四个规则的,特征值应该在$ [ - 4,4] $中,但它们明显不是。我使用Matlab(通过MATLink),并遇到了同样的问题,所以这显然是一个超越mathematica的问题。问题是:处理它的最佳方法是什么?我相信MATLAB和Mathematica使用了古老的EISPAK代码,所以可能有更新/更好的东西
答案 0 :(得分:0)
用于密集矩阵的特征值方法通常通过首先将矩阵转换为Hessenberg形式进行,这将导致三对角矩阵。之后,应用了移位QR算法的某些变体(如凸起跟踪)来迭代地减少非对角元素,并在这些元素变得足够小的位置处对其进行分割。
但是我想引起注意的是第一步及其结构破坏了后果。例如,不能保证三对角矩阵仍然是对称的。如果未明确为对称矩阵量身定制的话,这也适用于所有其他步骤。
但是更重要的是,此步骤将忽略图形的所有连通性或非连通性,并且当转换逆向时,尽管权重很小,但可能会连接所有节点。
图的m
连通分量的每个给出一个特征值4,其特征向量在分量的节点处为1,其他为0。这些本征空间的维数均为1。矩阵的任何细微扰动都将消除该分离,并将它们加入维度m
的本征空间中,然后将其扰动为多个特征值。然后,这可以在半径m
周围的原始值4的复平面上产生近似规则的4*(1e-15)^(1/m)
尖星,即使对于中等大小的m
也会产生与真实特征值的显着偏差
因此,总而言之,请使用稀疏方法,因为这些方法通常会首先将矩阵重新排序为对角线,这应根据组件给出块对角线结构。然后,特征值方法将自动对所有块分别进行处理,从而避免上述混合。并且,如果可能的话,请使用对称矩阵的方法或设置相应的选项/标志(如果存在)。