【问题标题】:Logical comparison of a symmetric matrix and its transpose对称矩阵及其转置的逻辑比较
【发布时间】:2019-08-28 14:39:27
【问题描述】:

我试图用数值测试矩阵及其转置的乘法是否真的生成了一个对称方阵。

下面是我使用的代码:

mat = np.array([[1,2,3],[1,0,1],[1,1,1],[2,3,5]])
mat2 = np.linalg.inv(np.matmul(np.transpose(mat),mat))
mat2
array([[ 1.42857143,  0.42857143, -0.85714286],
   [ 0.42857143,  1.92857143, -1.35714286],
   [-0.85714286, -1.35714286,  1.21428571]])

mat2 看起来是对称的。

但是,下面代码的结果让我很困惑:

np.transpose(mat2) == mat2
array([[ True, False, False],
   [False,  True, False],
   [False, False,  True]])

但是当我用 mat 做同样的过程时,结果和我预期的一样:

np.transpose(np.matmul(np.transpose(mat),mat)) == np.matmul(np.transpose(mat),mat)
array([[ True,  True,  True],
   [ True,  True,  True],
   [ True,  True,  True]])

这是否与计算问题有关?如果是这样,我如何证明非对角线元素是相同的?

【问题讨论】:

    标签: python numpy matrix transpose


    【解决方案1】:

    比较matmat.T,你是在比较整数和整数,没有问题。

    mat2 是浮点数,容易出现细微的错误。当您打印出mat2 时,您会看到完整数字的截断版本。查看mat2mat2.T 之间的区别

    >>> mat2 - mat2.T
    array([[ 0.00000000e+00,  1.11022302e-16, -1.11022302e-16],
           [-1.11022302e-16,  0.00000000e+00,  2.22044605e-16],
           [ 1.11022302e-16, -2.22044605e-16,  0.00000000e+00]])
    

    差异在0.0000000000000001 的顺序上,这意味着它们“出于所有意图和目的”相等,但不完全相等。从这里有两个地方可以去。您可以接受数值精度是有限的,并使用 numpy.allclose 之类的东西进行相等测试,这会导致一些小错误:

    >>> np.allclose(mat2, mat2.T)
    True
    

    或者,如果你真的坚持你的矩阵是对称的,你可以用这样的东西来强制它:

    >>> mat3 = (mat2 + mat2.T)/2
    >>> mat3 == mat3.T
    array([[ True,  True,  True],
           [ True,  True,  True],
           [ True,  True,  True]])
    

    【讨论】:

    • 我知道在计算浮点数时存在数值错误。但据我所知,对矩阵进行转置只是切换非对角元素的对应项。由于没有进行数值计算,因此 mat2[0,1] 和 mat2.T[1,0] 应该相同。你怎么看?
    • 浮点错误是在你做np.linalg.inv时出现的,而不是在你进行转置时出现的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2018-04-16
    • 2017-05-30
    • 2022-01-07
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多