【发布时间】:2021-12-20 22:23:35
【问题描述】:
我正在尝试查找 np.matrix 数据类型的逆(np.array 也相同)。在矩阵上调用 np.linalg.inverse 会产生两个接近但不同的结果。是什么原因造成的?哪一个比其他更可取?
由于矩阵数据类型在使用'*'运算符时使用向量乘法,我们不应该得到
[m.T * m]^-1 = m^-1 * m.T^-1
m^-1 * m.T^-1 * m.T = m^-1
结果1?
因此,结果 1 将等于结果 2。
我意识到我们计算结果 1 的方式是实现图像的透视投影矩阵的正确方法,因为它与 cv2.getPerspectiveTransform 给出了相同的结果。这有什么具体原因吗?
>>> m = np.matrix(v)
>>> m
>>> matrix([[ 3., 4., 1.],
[ 2., 44., 55.],
[ 99., 129., 343.]])
>>> res1 = np.linalg.inv(m.T * m) * m.T
>>> res2 = np.linalg.inv(m)
>>> res1
matrix([[ 0.2054252613732362, -0.0319299237072599, 0.0045210511443909],
[ 0.122248195432692 , 0.0238896452516133, -0.0041871098666807],
[-0.1052685658506345, 0.000231190115337 , 0.0031852860335482]])
>>> res2
matrix([[ 0.2054252613732693, -0.0319299237072619, 0.0045210511443911],
[ 0.1222481954327108, 0.0238896452516119, -0.0041871098666804],
[-0.1052685658506512, 0.0002311901153382, 0.0031852860335483]])
【问题讨论】:
-
对浮点数的计算并不精确,因此两个结果都只是近似逆矩阵的精确值。例如,逆矩阵第一行第一列元素的实际值为727/3539。这个分数的十进制扩展的前30位是0.205425261373269285108787793162。
-
*进行元素乘法。如果您想要矩阵乘法,请使用@(一个相对较新的中缀运算符)。 -- 转置不通常等于倒置。注意这一点。在特殊情况下是相等的。 -
@ChristophRackwitz 对于
np.matrix对象*实际上是矩阵乘法运算符。此外,在数学上,OP 使用的两个公式都给出了m的倒数。 -
感谢@bb1 对主要问题的回答。您可能还想查看有关 opencv getPerspectiveTransform 问题的更多理论答案。
标签: python numpy opencv linear-algebra matrix-inverse