Рассчитать вращение между 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 в коде была ошибка, которая предполагала неправильные измерения для матрицы решения, но я исправил ее, изменив одну строку в методе решения ().

Другие вопросы по тегам