#matrix #reflection #rotation #orthogonal #procrustes
#матрица #отражение #вращение #ортогональный #прокрусты
Вопрос:
Учитывая две матрицы mat1
и mat2
, каждая из которых представляет набор из 3 точек в трехмерном пространстве, я хочу повернуть mat2
их так, чтобы они совпадали mat1
с использованием ортогональных прокрустов :
mat1 <- t(matrix(c(1.16, 0.21, 0.11, -0.78, -0.02, -0.73, -0.37, -0.18, 0.62), nrow=3))
mat2 <- t(matrix(c(0.40, -0.94, -0.05, -0.91, 0.24, -0.38, 0.51, 0.70, 0.43), nrow=3))
Q <- cds::orthprocr(mat1 , mat2)$Q
mat2_rotated <- mat2 %*% Q
Затем матрица Q
должна представлять оптимальное вращение / отражение для применения mat2
, чтобы соответствовать как можно больше mat1
. Это также означает, что оптимальное вращение / отражение между mat1
и mat2_rotated
должно быть единичной матрицей. Однако, похоже, это не так :
Q_2 <- cds::orthprocr(mat1 , mat2_rotated)$Q
#frobenius norm of the difference between Q_2 and Identity :
sqrt(sum((Q_2 - diag(3))^2)) # returns 2 !!!
Где я ошибаюсь? Также каким был бы способ (возможно, какая-то другая реализация?) Получить идентификацию как оптимальную ортогональную матрицу, когда рассматриваемые матрицы уже установлены?
Обратите внимание, что в приведенном выше примере я отмечаю, что mat2_rotated
это инвариантно относительно Q_2
поворота / отражения :
sqrt(sum((mat2_rotated - (mat2_rotated %*% Q_2))^2)) # returns 1.400699e-15