Python矩阵逆

Rav*_*310 2 python arrays numpy 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]]
Run Code Online (Sandbox Code Playgroud)

现在,我试图找到k使用numpy(使用np.linalg.inv(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]]
Run Code Online (Sandbox Code Playgroud)

现在,我期待一个完美的单位矩阵,但由于应该为零的值非常小,我决定忽略这样一个事实,即结果不是一个完美的单位矩阵.

现在我的问题:我有其他两个矩阵Rh.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]]
Run Code Online (Sandbox Code Playgroud)

我的R矩阵:

[[ 1.  0.  0.]
 [ 0.  1. -0.]
 [-0.  0.  1.]]
Run Code Online (Sandbox Code Playgroud)

H1生产的价值使用H1 = k*R*k1*h:

[[ 1.71025842 -0.         -0.        ]
 [-0.          0.13923258  0.        ]
 [ 0.         -0.          1.        ]]
Run Code Online (Sandbox Code Playgroud)

H1生产的价值使用H1 = k*k1*h:

[[ 1.71025842 -0.         -0.05011282]
 [-0.          0.13923258 -0.02107099]
 [-0.         -0.          1.        ]]
Run Code Online (Sandbox Code Playgroud)

为什么H1不等于h它的价值呢?我怎样才能解决这个问题?

cs9*_*s95 6

您对*操作员所做操作的理解存在缺陷.它不执行点积.但是在两个阵列上执行元素乘法,也称为Hadamard乘积.

所以,如果你有两个2D数组,A并且B点积用以下公式计算:

在此输入图像描述

然而,hadamard产品看起来像这样 -

在此输入图像描述

这是元素乘法(以及您目前正在做的事情).尝试通过调用np.ndarray.dot或使用@运算符替换它:

>>> k.dot(k1)
Run Code Online (Sandbox Code Playgroud)

要么,

>>> k @ k1   # python3.5+
Run Code Online (Sandbox Code Playgroud)

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
Run Code Online (Sandbox Code Playgroud)

与此形成鲜明对比 -

>>> 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]])
Run Code Online (Sandbox Code Playgroud)

这是你早些时候得到的.