Scipy eigsh 返回复杂输入矩阵的错误结果

Scipy eigsh returning wrong results for complex input matrix

我正在尝试使用其移位反转模式找到具有 scipy.sparse.linalg.eigsh 的复数矩阵的特征值和特征向量。对于矩阵中的实数,spicy.linalg.eigh 求解器得到相同的结果,但是当添加虚部时,特征值发散。一个小例子:

import numpy as np
from scipy.linalg import eigh
from scipy.sparse.linalg import eigsh

n = 10
X = np.random.random((n, n)) - 0.5 + (np.random.random((n, n)) - 0.5) * 1j
X = np.dot(X, X.T)  # create a symmetric matrix

evals_all, evecs_all = eigh(X)
evals_small, evecs_small = eigsh(X, 3, sigma=0, which='LM')

print(sorted(evals_all, key=abs))
print(sorted(evals_small, key=abs))

本例中的打印例如

[0.041577858515751132, -0.084104744918533481, -0.58668240775486691, 0.63845672501004724, -1.2311727737115068, 1.5193345703630159, -1.8652302423152105, 1.9970059660853923, -2.6414593461321654, 2.8624290667460293]
[-0.017278543470343462, -0.32684893256215408, 0.34551438015659475]

而在真实情况下,前三个特征值是相同的。

我知道我正在将一个密集矩阵传递给稀疏求解器,但这只是一个示例。

我可能在某处遗漏了一些明显的东西,但我很高兴能得到一些提示去寻找。谢谢!

scipy 是 not checking 你的输入,如果它是 hermitian。

按照 link 中的建议进行操作:

if not np.allclose(X, np.asmatrix(X).H):
    raise ValueError('expected symmetric or Hermitian matrix')

输出:

ValueError: expected symmetric or Hermitian matrix

我认为你看到的那些负特征值也表明了这一点(但基于复数的数学真的不是我的专长...)。