相同的scipy . linear . high()特征值不相等



我使用Python 2.7, NumPy 1.6.2和SciPy 0.16.0来计算以下内容。

我已经创建了一个Hadamard矩阵。然后我得到了矩阵的第0,2,4个向量的外积并将它们相加,使对角线为0。然后我使用scipy . linear . high()计算了特征值。它是退化的。前两个特征值相同,即-3。但是当我用Python检查时,它说它们不一样。代码如下:

from scipy import linalg as sp
import numpy
from numpy import linalg as np
def get_outer_product(vector):
    length = len(vector)
    outer_product = [[0 for x in range(length)] for x in range(length)]
    for i in range(0, length):
        for j in range(0, length):
            if i == j:
                outer_product[i][j] = 0
                continue
            outer_product[i][j] = vector[i] * vector[j]
    return outer_product
def test():
    hadamard_matrix = sp.hadamard(8)
    sum_of_outer_products = [map(sum, zip(*t)) for t in zip(get_outer_product(hadamard_matrix[0]), get_outer_product(hadamard_matrix[2]))]
    sum_of_outer_products = [map(sum, zip(*t)) for t in zip(sum_of_outer_products, get_outer_product(hadamard_matrix[4]))]
    e_vals, e_vecs = sp.eigh(sum_of_outer_products)
    print str(e_vals[0]) + " == " + str(e_vals[0]) + "?"
    print e_vals[0] == e_vals[1]

输出为:

Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32
>>> import scipytest
>>> scipytest.test()
-3.0 == -3.0?
False

我做错了什么?

浮点问题

当使用浮点数时,始终要小心使用相等操作符,并记住可能存在精度问题,并使用安全比较:

print str(e_vals[0]) + " == " + str(e_vals[0]) + "?"
print e_vals[0] == e_vals[1]
print numpy.isclose(e_vals[0], e_vals[1])
顺便说一下,在我的机器上,它在两种情况下都返回true:
-3.0 == -3.0?
True
True

最新更新