Weird behavior with orthogonal procrustes

86 views Asked by At

Given two matrices mat1 and mat2, each one representing a set of 3 points in a 3 dimensional space, I want to rotate mat2 so that it matches mat1 using orthogonal procrustes :

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

The matrix Q should then represent the optimal rotation / reflection to apply to mat2 to fit as much as possible mat1. This also means that the optimal rotation/reflection between mat1 and mat2_rotated should be the identity matrix. However, this doesn't seem to be the case :

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 !!!

Where am I wrong? Also what would be the way (some other implementation maybe?) to obtain Identity as optimal orthogonal matrix when the considered matrices are already fitted?

Note that, in the above example, I remark that mat2_rotated is invariant regarding Q_2 rotation / reflection :

sqrt(sum((mat2_rotated - (mat2_rotated %*% Q_2))^2)) # returns 1.400699e-15
0

There are 0 answers