Это классическая задача линейной алгебры, ключевая фраза для поиска - «множественная линейная регрессия».
Мне приходилось кодировать некоторые вариации этого много раз за эти годы. Например, код для калибровки планшета планшета или сенсорного экрана стилуса использует ту же математику.
Вот математика:
Пусть p будет входным вектором, а q соответствующим выходным вектором.
Требуемое преобразование - это матрица 3x3; назовите это A .
Для одного вектора входа и выхода p и q существует вектор ошибки e
e = q - A x p
Квадрат величины ошибки является скалярным значением:
e T 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 P T x ( P x P T) ^ -1
(где ^ -1 - обратный оператор - извините за отсутствие индексов или индексов)
Вот алгоритм:
Создать матрицу 3xN P из набора входных векторов.
Создать матрицу 3xN Q из набора выходных векторов.
Матричное умножение R = P x транспонирование ( P )
Вычислить обратную величину R
Матричное умножение A = Q x транспонирование ( P ) x обратное ( R )
с использованием процедур умножения матриц и обращения матриц выбранной вами библиотеки линейной алгебры.
Однако , матрица аффинного преобразования 3x3 способна масштабировать и вращать входные векторы, но не выполняет какой-либо перевод! Это может быть недостаточно общим для вашей проблемы. Обычно хорошей идеей является добавление «1» в конце каждого из 3-векторов, чтобы затем получить 4-вектор, и поиск лучшей матрицы преобразования 3х4, которая минимизирует ошибку. Это не может повредить; это может только привести к лучшему соответствию данных.