2013-06-19 2 views
0

У меня есть 2 набора 3D-векторов с N элементами. Я пытаюсь вычислить матрицу Rotation, которая наилучшим образом выравнивает первый набор со вторым набором.Расчет вращения между двумя наборами векторов

Я считаю, что я могу использовать java-библиотеку JAMA, чтобы выполнить это с помощью разложения сингулярных значений или разложения EigenValue.

1) Есть ли SVD или EVD правильный алгоритм для использования?

2) SVD/EVD в JAMA требует матрицы. Как заполнить матрицу на основе двух наборов векторов?

+0

было бы лучше чтобы добавить некоторый код ваших попыток, чтобы мы могли попытаться помочь вам в этом. – Jon

+0

Я ничего не смог сделать, потому что не знаю, как заполнить матрицу, необходимую для вызова функций JAMA. Или если эти функции JAMA даже соответствующие алгоритмы для вызова. – user66332

ответ

0

Вот 2-D версия о том, что я верю, что вы описываете (перевод его 3-D должен быть простым, за исключением м-матрицы будет 3х3 и иметь shftx/y/z записей).

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