我正在尝试使用 scipy.sparse.linalg.eigsh 找到 Python 中稀疏 Hermitian 矩阵列表的最小(如最负数,而不是最低量级)几个特征值。矩阵约为 1000x1000,列表长度约为 500-2000。此外,我知道所有矩阵的特征值的上限和下限——分别称它们为eig_UB和eig_LB。
我试过两种方法:
- 使用 sigma= eig_LB的移位反转模式。
- 从每个矩阵的对角线中减去eig_UB(从而将最小的特征值转换为最大幅度的特征值),使用默认 eigsh 设置对生成的矩阵进行对角化(无移位反转模式并使用 which='LM'),然后将eig_UB添加到得到的特征值。
两种方法都有效且结果一致,但方法 1 的速度大约快 2-2.5 倍。这似乎违反直觉,因为(至少按照我对 eigsh 文档的理解)移位反转模式从对角线中减去 sigma,反转矩阵,然后找到特征值,而默认模式直接找到最大幅度的特征值。有谁知道什么可以解释性能差异?
另一条信息:我已经检查过,移位反转产生的矩阵(即,如果 M 是原始矩阵,则为 (M-sigma*identity)^(-1))不再稀疏,这似乎就像它应该使找到它们的特征值需要更长的时间。