Conflict between np.linalg.matrix_rank() and np.linalg.det()

  求逆矩阵的时候,发现了一个有趣的问题,其实以前songzhirui给我说过的python的双精度浮点数存储问题,这次又遇到了,mark一下!


>>> import numpy as np
>>> c = np.array([[52, 50, 46],[50, 50, 40],[46, 40, 50]])
>>> c
array([[52, 50, 46],
       [50, 50, 40],
       [46, 40, 50]])
 >>> np.linalg.matrix_rank(c)
# 到这里发现了矛盾,矩阵的秩是2,为什么行列式的值不==0?
# 我自己算了下(八字右一瞥减去八字左一撇)确实==0
>>> np.linalg.det(c)
-3.1263880373444432e-12
# 还是可以得到逆矩阵,也可以接着计算,但是都不准确
>>> c_inv = np.linalg.det(c)
>>> np.dot(c,c_inv)
array([[-1.62572178e-10, -1.56319402e-10, -1.43813850e-10],
       [-1.56319402e-10, -1.56319402e-10, -1.25055521e-10],
       [-1.43813850e-10, -1.25055521e-10, -1.56319402e-10]])

为什么会出现这样的问题? 因为python采用双精度存储,具体可参考此文:

Python的浮点数损失精度问题

嗯嗯,因为这个问题,所以在判断一个矩阵是不是可逆的时候,还是用np.linalg.matrix_rank()更靠谱一些!

写给自己:
  内存/磁盘这些存储设备就是大量的开关,(想想单片机课上学的蜈蚣一样的电路板),每个开关有开/关两种状态,可以存储一个1或者一个0。所以二进制就不难理解了。在计算机领域,8个开关分一组称为1字节(byte)每个开关是1位(bit),即8位1字节。

猜你喜欢

转载自blog.csdn.net/maggieJJ/article/details/85806371
np