对称矩阵的逆

时间:2014-11-21 12:14:25

标签: python arrays numpy scipy

实对称矩阵的逆应理论上应返回一个实对称矩阵(同样对Hermitian矩阵有效)。但是,当我用numpy或scipy计算逆时,返回的矩阵是不对称的。我知道这是由于数字错误造成的。

避免这种不对称的最佳方法是什么?我希望它在数学上是有效的,以便在我的计算中使用它时不会进一步传播错误。

import numpy as np

n = 1000
a =np.random.rand(n, n)
a_symm = (a+a.T)/2

a_symm_inv = np.linalg.inv(a_symm)

if (a_symm_inv == a_symm_inv.T).all():
    print("Inverse of matrix A is symmetric") # This does not happen!
else:
    print("Inverse of matrix A is asymmetric")
    print("Max. asymm. value: ", np.max(np.abs((a_symm_inv-a_symm_inv.T)/2)))

修改

这是我解决问题的方法:

math_symm = (np.triu_indices(len(a_symm_inv), 1))
a_symm_inv[math_symm]=np.tril(a_symm_inv, -1).T[math_symm]

2 个答案:

答案 0 :(得分:1)

幸运的是,这个逆是对称的。不幸的是,你不能用这种方式比较浮点数:

>>> import numpy as np
>>> 
>>> n = 1000
>>> a =np.random.rand(n, n)
>>> a_symm = (a+a.T)/2
>>> 
>>> a_symm_inv = np.linalg.inv(a_symm)
>>> a_symm_inv_T = a_symm_inv.T
>>> print a_symm_inv[2,1]
0.0505944152801
>>> print a_symm_inv_T[2,1]
0.0505944152801
>>> print a_symm_inv[2,1] == a_symm_inv_T[2,1]
False

幸运的是,你可以使用numpy all close来解决这个问题http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html

>>> np.allclose(a_symm_inv, a_symm_inv_T)
True

看起来像是你的幸运日

编辑:哇,我很惊讶,cels答案看起来比这更快:

>>> import timeit
>>> setup = """import numpy as np
... a = np.random.rand(1000, 1000)
... b = np.random.rand(1000, 1000)
... def cool_comparison_function(matrix1, matrix2):
...     epsilon = 1e-9
...     if (np.abs(matrix1 - matrix2) < epsilon).all():
...             return True
...     else:
...             return False
... """
>>> timeit.Timer("cool_comparison_function(a,b)",setup).repeat(1, 1000)
[2.6709160804748535]
>>> timeit.Timer("np.allclose(a,b)",setup).repeat(1, 1000)
[11.295115947723389]

答案 1 :(得分:1)

这个简单的改变应该说服你,反转确实是一个对称矩阵。不是数学上的,但至少在数字上 - 这是一个小的误差阈值epsilon

n = 1000
a =np.random.rand(n, n)
a_symm = (a+a.T)/2

a_symm_inv = np.linalg.inv(a_symm)
epsilon = 1e-9
if (np.abs(a_symm_inv - a_symm_inv.T) < epsilon).all():
    print("Inverse of matrix A is symmetric")
else:
    print("Inverse of matrix A is asymmetric")
    print("Max. asymm. value: ", np.max(np.abs((a_symm_inv-a_symm_inv.T)/2)))

哪个输出:

Inverse of matrix A is symmetric