Странное поведение с ортогональными прокрустами

#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