我正在尝试使用参数(a,tol=1e-8)
创建一个函数,该函数返回一个布尔值,告诉用户矩阵是否对称(对称矩阵等于其转置)。到目前为止,我有:
def check_symmetric(a, tol=1e-8):
if np.transpose(a, axes=axes) == np.transpose(a, axes=axes):
return True
def sqr(s):
rows = len(s)
for row in sq:
if len(row) != rows:
return False
return True
if a != sqr(s):
raise ValueError
虽然我一直收到axes isn't defined
消息,所以我很确定它根本不起作用......我想通过的测试是:
e = np.eye(4)
f = np.diag([1], k=3)
g = e[1:, :]
print(check_symmetric(e))
print(not check_symmetric(e + f))
print(check_symmetric(e + f * 1e-9))
print(not check_symmetric(e + f * 1e-9, 1e-10))
try:
check_symmetric(g)
print(False)
except ValueError:
print(True)
感谢任何帮助,谢谢!
答案 0 :(得分:35)
您可以使用allclose
def check_symmetric(a, rtol=1e-05, atol=1e-08):
return numpy.allclose(a, a.T, rtol=rtol, atol=atol)
答案 1 :(得分:1)
这是一篇旧帖子,但我会推荐另一种方法。特别是对于稀疏矩阵,这可以快数百倍。
def is_symmetric(A, tol=1e-8):
return scipy.sparse.linalg.norm(A-A.T, scipy.Inf) < tol;
或类似的,但你懂的。使用范数是一种更优化的计算。
答案 2 :(得分:0)
以下功能也可以解决问题:
def check_symmetric(a, tol=1e-8):
return not False in (np.abs(a-a.T) < tol)
答案 3 :(得分:0)
如果您不担心 tot
阈值
(a==a.T).all()
是最简单的解决方案。这也适用于 N 维 (N>2) 数组。