Python矩阵求逆
Python matrix inverse
我有一个相机矩阵 k
我已经计算过了。 k
的值为:
[[ 1.92160183e+08 0.00000000e+00 3.06056985e+02]
[ 0.00000000e+00 1.92160183e+08 1.57709172e+02]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
现在,我尝试使用 numpy(使用 np.linalg.inv(k)
)找到 k
的倒数。设 k1
为 k
.
的倒数
使用numpy,k*k1
的值为:
[[ 1.00000000e+00 0.00000000e+00 -4.87462472e-04]
[ 0.00000000e+00 1.00000000e+00 -1.29434633e-04]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
现在,我期待一个完美的单位矩阵,但由于应该为零的值非常小,我决定忽略结果不是一个完美的单位矩阵这一事实。
现在我的问题是:我还有另外两个矩阵 R
和 h
。 R
是单位矩阵(它并不总是单位矩阵,但为简单起见假设如此)。我需要执行 H1 = k*R*k1*h
。这应该理想地将 h 的值分配给 H1(因为 k*R*k1
应该是身份)。
我原来的h矩阵:
[[ 1.71025842e+00 -7.51761942e-01 1.02803446e+02]
[ -2.98552735e-16 1.39232576e-01 1.62792482e+02]
[ -1.13518150e-18 -2.27094753e-03 1.00000000e+00]]
我的 R 矩阵:
[[ 1. 0. 0.]
[ 0. 1. -0.]
[-0. 0. 1.]]
使用H1 = k*R*k1*h
生成的H1
的值:
[[ 1.71025842 -0. -0. ]
[-0. 0.13923258 0. ]
[ 0. -0. 1. ]]
使用H1 = k*k1*h
生成的H1
的值:
[[ 1.71025842 -0. -0.05011282]
[-0. 0.13923258 -0.02107099]
[-0. -0. 1. ]]
为什么 H1
的值没有达到应有的 h
?我怎样才能解决这个问题?
您对 *
运算符作用的理解存在缺陷。它不执行点积。而是对两个数组执行 元素乘法 ,也称为 Hadamard product.
因此,如果您有两个二维数组,A
和 B
,则点积的计算方式为 -
然而,hadamard 产品看起来像这样 -
这是逐元素乘法(以及您当前正在做的)。尝试将其替换为调用 np.ndarray.dot
或使用 @
运算符:
>>> k.dot(k1)
或者,
>>> k @ k1 # python3.5+
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
将此与 -
对比
>>> k * k1
array([[ 1.00000000e+00, 0.00000000e+00, -4.87462473e-04],
[ 0.00000000e+00, 1.00000000e+00, -1.29434634e-04],
[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
这是你之前得到的。
我有一个相机矩阵 k
我已经计算过了。 k
的值为:
[[ 1.92160183e+08 0.00000000e+00 3.06056985e+02]
[ 0.00000000e+00 1.92160183e+08 1.57709172e+02]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
现在,我尝试使用 numpy(使用 np.linalg.inv(k)
)找到 k
的倒数。设 k1
为 k
.
使用numpy,k*k1
的值为:
[[ 1.00000000e+00 0.00000000e+00 -4.87462472e-04]
[ 0.00000000e+00 1.00000000e+00 -1.29434633e-04]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
现在,我期待一个完美的单位矩阵,但由于应该为零的值非常小,我决定忽略结果不是一个完美的单位矩阵这一事实。
现在我的问题是:我还有另外两个矩阵 R
和 h
。 R
是单位矩阵(它并不总是单位矩阵,但为简单起见假设如此)。我需要执行 H1 = k*R*k1*h
。这应该理想地将 h 的值分配给 H1(因为 k*R*k1
应该是身份)。
我原来的h矩阵:
[[ 1.71025842e+00 -7.51761942e-01 1.02803446e+02]
[ -2.98552735e-16 1.39232576e-01 1.62792482e+02]
[ -1.13518150e-18 -2.27094753e-03 1.00000000e+00]]
我的 R 矩阵:
[[ 1. 0. 0.]
[ 0. 1. -0.]
[-0. 0. 1.]]
使用H1 = k*R*k1*h
生成的H1
的值:
[[ 1.71025842 -0. -0. ]
[-0. 0.13923258 0. ]
[ 0. -0. 1. ]]
使用H1 = k*k1*h
生成的H1
的值:
[[ 1.71025842 -0. -0.05011282]
[-0. 0.13923258 -0.02107099]
[-0. -0. 1. ]]
为什么 H1
的值没有达到应有的 h
?我怎样才能解决这个问题?
您对 *
运算符作用的理解存在缺陷。它不执行点积。而是对两个数组执行 元素乘法 ,也称为 Hadamard product.
因此,如果您有两个二维数组,A
和 B
,则点积的计算方式为 -
然而,hadamard 产品看起来像这样 -
这是逐元素乘法(以及您当前正在做的)。尝试将其替换为调用 np.ndarray.dot
或使用 @
运算符:
>>> k.dot(k1)
或者,
>>> k @ k1 # python3.5+
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
将此与 -
对比>>> k * k1
array([[ 1.00000000e+00, 0.00000000e+00, -4.87462473e-04],
[ 0.00000000e+00, 1.00000000e+00, -1.29434634e-04],
[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
这是你之前得到的。