python - 对称矩阵及其转置的逻辑比较
问题描述
我试图用数值测试矩阵及其转置的乘法是否真的生成了一个对称的方阵。
下面是我使用的代码:
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]])
但是当我用垫子做同样的过程时,结果和我预期的一样:
np.transpose(np.matmul(np.transpose(mat),mat)) == np.matmul(np.transpose(mat),mat)
array([[ True, True, True],
[ True, True, True],
[ True, True, True]])
这与计算问题有关吗?如果是这样,我如何证明非对角线元素是相同的?
解决方案
比较mat
and mat.T
,您将整数与整数进行比较,没有问题。
mat2
是浮点数,容易出现细微的错误。当您打印出来时mat2
,您会看到完整数字的截断版本。看看 和之间的区别:mat2
mat2.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]])
推荐阅读
- python - Python 包设置:setup.py 自定义处理包装的 fortran
- java - HttpClient : 读入 file:// 目标中的文本文件
- sql - 在 SQL Server 中使用表变量参数优化存储过程的最佳方法是什么?
- python - 如何构建包含系统参数的 json?
- regex - 重复模式的正则表达式
- excel - 使用两个下拉菜单从另一张表中收集特定信息
- javascript - 比较javascript中的时间戳
- android - 使用 API 将 OBB 扩展文件上传到 Google Play 草案工件
- python - Seaborn 和 Pandas:使用 python 中的多索引数据制作多个 x 类别条形图
- sql - sql语句在复杂的where语句中更新多行中的多个值