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

时间:2017-10-12 08:33:47

标签: python scipy complex-numbers eigenvalue eigenvector

我试图使用其shift-invert模式使用scipy.sparse.linalg.eigsh找到复杂矩阵的特征值和特征向量。只有矩阵中的实数我得到了相同的结果,因为辛辣.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]

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

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

我可能在某个地方遗漏了一些明显的东西,但是我会很高兴看到一些提示。谢谢!

1 个答案:

答案 0 :(得分:0)

scipy not checking是你的输入,如果它是埃尔米特人。

像链接中提出的那样做:

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

输出:

ValueError: expected symmetric or Hermitian matrix

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