求逆矩阵的时候,发现了一个有趣的问题,其实以前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
>>> np.linalg.det(c)
-3.1263880373444432e-12
# 到这里发现了矛盾,矩阵的秩是2,为什么行列式的值不==0,其实也很小了,接近于零。
# 我自己算了下(八字右一瞥减去八字左一撇)确实==0
# 还是可以得到逆矩阵,也可以接着计算,但是都不准确
>>> 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采用双精度存储,具体可参考此文:
嗯嗯,因为这个问题,所以在判断一个矩阵是不是可逆的时候,还是用np.linalg.matrix_rank()更靠谱一些!
写给自己:
内存/磁盘这些存储设备就是大量的开关,(想想单片机课上学的蜈蚣一样的电路板),每个开关有开/关两种状态,可以存储一个1或者一个0。所以二进制就不难理解了。在计算机领域,8个开关分一组称为1字节(byte)每个开关是1位(bit),即8位1字节。