Това е класическа задача на линейната алгебра, ключовата фраза за търсене е "множествена линейна регресия".
Трябваше да кодирам някои варианти на това много пъти през годините. Например кодът за калибриране на таблет с дигитайзер или сензорен екран със стилус използва същата математика.
Ето математиката:
Нека p е входен вектор и q съответният изходен вектор.
Трансформацията, която искате, е матрица 3x3; наречете гоА.
За един входен и изходен вектор p и q има вектор на грешка e
e = q - A x p
Квадратът на големината на грешката е скаларна стойност:
eT x e = (q - A x p)T x ( q - A x p)
(където операторът T е транспониране).
Това, което наистина искате да минимизирате, е сумата от стойностите на e за наборите:
E = сума (e)
Този минимум удовлетворява матричното уравнение D = 0, където
D(i,j) = частната производна на E по отношение на A(i,j)
Да кажем, че имате N входни и изходни вектора.
Вашият набор от входни 3-вектора е 3xN матрица; наречете тази матрица P. I-тата колона на P е i-тият входен вектор.
Такъв е наборът от изходни 3-вектори; наречете тази матрица Q.
Когато преминете през цялата алгебра, решението е
A = Q x PT x (P x PT) ^- 1
(където ^-1 е обратният оператор -- съжалявам, че няма горни или долни индекси)
Ето алгоритъма:
Създайте 3xN матрица P от набора от входни вектори.
Създайте 3xN матрица Q от набора изходни вектори.
Матрично умножение R = P x транспониране (P)
Изчислете обратното на R
Матрично умножение A = Q x транспониране (P) x обратно (R)
като използвате процедурите за умножение на матрици и инверсия на матрици от избраната от вас библиотека за линейна алгебра.
Въпреки това матрицата за афинно преобразуване 3x3 е в състояние да мащабира и завърта входните вектори, но не да прави транслация! Това може да не е достатъчно общо за вашия проблем. Обикновено е добра идея да добавите "1" в края на всеки от 3-вектора, за да направите след това 4-вектор, и да потърсите най-добрата матрица за трансформация 3x4, която минимизира грешката. Това не може да навреди; това може да доведе само до по-добро съответствие на данните.
person
Die in Sente
schedule
15.10.2009