我想比较scipy
和numpy
用于计算厄米特矩阵(eigvalsh
)特征值的例程,并遇到一些意想不到的行为。
特别是,scipy
的{{1}}例程返回与eigvalsh
的{{1}}例程几乎相同的特征值,但仅适用于维度小于2000 x 2000的矩阵Spyder 2.3.7(Python 3.5)的例子:
numpy
事实上,如果eigvalsh
,特征值数组In [1]: import scipy
In [2]: import numpy as np
In [3]: H = np.random.rand(1999,1999) + np.random.rand(1999,1999) * 1j
...: H = H + H.conj().T
...: Es = scipy.linalg.eigvalsh(H)
...: En = np.linalg.eigvalsh(H)
...: sum(abs(En - Es))
Out[3]: 1.85734656821257e-10
In [4]: H = np.random.rand(2000,2000) + np.random.rand(2000,2000) * 1j
...: H = H + H.conj().T
...: Es = scipy.linalg.eigvalsh(H)
...: En = np.linalg.eigvalsh(H)
...: sum(abs(En - Es))
Out[4]: 89786.239714130075
只包含零,除了最后一个元素,它等于数组长度的24倍:
H.shape >= (2000,2000)
这里发生了什么?
答案 0 :(得分:0)
对于*.linalg.eigvalsh
例程,numpy
调用LAPACK -EVD
例程,这些例程基于分而治之算法。 scipy
调用LAPACK -EVR
,它使用不同的算法。
对于LAPACK文档,see here。这解释了你在2000年以下案例中看到的微小数字差异。
“全零”情况确实看起来像一个错误,但我无法在scipy == '0.17.1'
和np == '1.11.0'
上复制。升级后问题是否仍然存在?