Обратная матрица Python

У меня есть матрица камеры 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]]

Теперь я попытался найти инверсию 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]]

Я ожидал получить идеальную единичную матрицу, но поскольку значения, которые должны быть равны нулю, очень малы, я решил проигнорировать тот факт, что результат не был идеальной единичной матрицей.

Теперь моя проблема: у меня есть две другие матрицы R и h. R - это единичная матрица (это не всегда единичная матрица, но предполагаем, что это так для простоты). Мне нужно выполнить H1 = k*R*k1*h. В идеале это должно присвоить H1 значение h (так как 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, полученное с использованием H1 = k*R*k1*h:

[[ 1.71025842 -0.         -0.        ]
 [-0.          0.13923258  0.        ]
 [ 0.         -0.          1.        ]]

Значение H1, полученное с использованием H1 = k*k1*h:

[[ 1.71025842 -0.         -0.05011282]
 [-0.          0.13923258 -0.02107099]
 [-0.         -0.          1.        ]]

Почему значение H1 не становится равным h, как должно? Как я могу это исправить?


person RaviTej310    schedule 13.01.2018    source источник


Ответы (1)


Ваше понимание того, что делает оператор *, ошибочно. Он не выполняет скалярное произведение. Но вместо этого выполняет поэлементное умножение на двух массивах, также известное как Произведение Адамара.

Итак, если у вас есть два 2D-массива, A и B, точечный продукт вычисляется с помощью -

введите описание изображения здесь

Принимая во внимание, что продукт хадамара выглядит так -

введите описание изображения здесь

Это поэлементное умножение (и то, что вы сейчас делаете). Попробуйте заменить это вызовом np.ndarray.dot или оператором @:

>>> k.dot(k1)

Or,

>>> k @ k1   # python3.5+

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

Contrast this with -

>>> 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]])

Это то, что вы получали раньше.

person cs95    schedule 13.01.2018
comment
матрицы по определению 2D. Таким образом, использование термина 2D-матрицы излишне. Либо скажите 2D-массив, либо просто матрицы :) - person kmario23; 13.01.2018