繁体   English   中英

检查矩阵在 Numpy 中是否对称

[英]Checking if a matrix is symmetric in Numpy

我正在尝试使用参数(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)

任何帮助表示赞赏,谢谢!

您可以简单地使用allclose将其与其转置进行allclose

def check_symmetric(a, rtol=1e-05, atol=1e-08):
    return numpy.allclose(a, a.T, rtol=rtol, atol=atol)

下面的函数也解决了这个问题:

def check_symmetric(a, tol=1e-8):
    return np.all(np.abs(a-a.T) < tol)

这是一个旧帖子,但我会推荐另一种方法。 特别是对于稀疏矩阵,这可以快数百倍。

def is_symmetric(A, tol=1e-8):
    return scipy.sparse.linalg.norm(A-A.T, scipy.Inf) < tol;

或类似但你明白了。 使用范数是一种更优化的计算。

如果你不担心tot门槛

(a==a.T).all()

是最简单的解决方案。 这也适用于 N 维 (N>2) 数组。

如果可以接受使用 SciPy,则可以使用scipy.linalg.issymmetric() (从 v1.8.0 开始),它还包括一些输入验证。

  • 请参阅此处的实施。
  • 关于性能的说明(来自文档;强调我的):

    设置atol和/或rtol后,比较由numpy.allclose执行,并将公差值传递给它。 否则,由内部函数执行与零的精确比较。 因此,性能可以提高或降低,具体取决于数组的大小和数据类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM