Рассчитать вращение между 2 наборами векторов
У меня есть 2 набора 3D Векторов с N записями. Я пытаюсь вычислить матрицу вращения, которая лучше всего выравнивает первый набор со вторым набором.
Я полагаю, что могу использовать библиотеку java JAMA для достижения этой цели с помощью разложения по сингулярным значениям или разложения по EigenValue.
1) SVD или EVD правильный алгоритм для использования?
2) SVD / EVD в JAMA требует Матрицу. Как мне заполнить матрицу на основе моих двух наборов Векторов?
1 ответ
Вот 2-D версия того, что, как я полагаю, вы описываете (перевод на 3-D должен быть простым, за исключением того, что m-матрица будет 3x3 иshftx/y/z
записей).
Аффинное преобразование точки (x, y) в точку (u, v) может быть записано как:
u m11 m12 x shftx
= * +
v m21 m22 y shfty
You can rewrite this as:
x y 0 0 1 0 m11 u
* =
0 0 x y 0 1 m12 v
m21
m22
shftx
shfty
Причина, по которой вы делаете это таким образом, заключается в том, что матрица слева (со значениями x/y/0/1) содержит до столько строк, сколько точек в вашем наборе данных. Если вы назовете эту матрицу X, а вектор-столбец справа U, то проблема состоит в нахождении решения m наименьших квадратов для уравнения X * m = U. Вы можете решить это с помощью (new QRDecomposition(X)).solve(U)
, Я должен сказать, что по крайней мере в одной версии QRDecomposition в коде была ошибка, которая предполагала неправильные измерения для матрицы решения, но я исправил ее, изменив одну строку в методе решения ().