nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Красивые выкладки для матрицы аффинного преобразования

В прошлом посте мы эту задачу решили "в лоб" - муторно, но отчётливо знаешь, что к результату придёшь!

По пути с работы сообразил, как всё то же самое можно было сделать красиво, вообще не используя знака суммы (сигмы), и оставаясь в рамках матричных операций, без необходимости рассматривать отдельные компоненты.

Определим матрицу A, в которой будут размещаться все координаты уголковых отражателей "в метрах", а нижняя строка - безразмерные единицы:


Аффинное преобразование, которое нужно определить, запишем в виде матрицы 2х3:


И получающиеся точки на фотоприёмной матрице запишем в виде матрицы 2x6:


"Невязку" можно записать как



Это набор из 6 векторов, показывающих, насколько точно мы совместили каждую точку с изображением на фотоприёмной матрице, при выбранном преобразовании T. Теперь бы взять сумму квадратов всех компонентов этой невязки. И тут самое время взять след:



Это и будет сумма квадратов всех компонентов матрицы, причём порядок умножения матрицы на транспонированную не имеет значения!


О том, что такое след матрицы, немного писал в главе "Дэвенпорт берёт след" из ликбеза по кватернионам.

Небольшая иллюстрация. Если мы умножим матрицу невязки на себя транспонированную СЛЕВА, то получим матрицу 6х6:


И просуммировав все диагональные компоненты, получим сумму квадратов всех векторов невязок.

И то же самое, только "в другом порядке" получится, если умножить матрицу на себя СПРАВА, что даёт матрицу 2х2:


И снова, взяв сумму двух диагональных элементов, получим что надо.

Второй вариант, с матрицей 2х2 нам предпочтительнее. Запишем нашу сумму квадратов как функцию от T, которую надо минимизировать:


Раскроем скобки:


Последнее слагаемое не зависит от T, поэтому не интересует нас, можем его "выкинуть". Третье слагаемое является транспонированной версией второго слагаемого, а поскольку нас интересуют только диагональные элементы, можем одно заменить другим. Получим:


В прошлый раз, когда мы ковырялись с навигационной задачей, мы и первое слагаемое быстренько "выкинули", поскольку там была матрица поворота, она при транспонировании давала обратный поворот, и при перемножении они давали тождественное преобразование.

Но здесь кроме поворота мы ожидаем масштабирование, параллельные переносы и "ракурсы" (ужатие вдоль некоторой оси), ожидать тождественного преобразования не приходится!

Возьмём дифференциал от нашей функции:


dT - это матрица, состоящая из бесконечно малых приращений:


Начнём подставлять T+dT в выражение:






Второе слагаемое - это транспонированное первое, а поскольку нас интересуют только диагональные элементы, можно второе удвоить, а первое выкинуть, результат не поменяется:



Мы почти у цели. Необходимым условием минимума является нулевой дифференциал, т.е скобка перед dTT должна равняться нулю:



Помножаем обе части на (AAT)-1:



Это и есть ответ.

Правда, нам как-то удобнее вышло получить транспонированный результат, привычнее, когда полученные данные, матрицу F, мы помножаем СЛЕВА, чтобы превратить в матрицу аффинного преобразования.


Получается вот так:


Если выписать в явном виде матрицу AAT (её размер 3х3), получим те же суммы, которые привели вчера.

В общем-то, такое хитрое нагромождение из матриц A не должно удивлять, в линейных задачах, решаемых по методу наименьших квадратов, такое всегда возникает. "Псевдообратная матрица Мура-Пенроуза", так-то :)

Теперь ещё мысля возникла: а нельзя ли вместо единиц в нижней строке подставить что-нибудь поинтереснее для нашей трёхмерной мишени?
Tags: ПЛИС, математика, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Тестируем atan1 на QuatCore

    Пора уже перебираться на "железо" потихоньку. Решил начать с самого первого алгоритма, поскольку он уже был написан на ассемблере. В программу внёс…

  • Формулы приведения, что б их... (и atan на ТРЁХ умножениях)

    Формулу арктангенса на 4 умножениях ещё немножко оптимизировал с помощью алгоритма Ремеза: Ошибка уменьшилась с 4,9 до 4,65 угловой секунды, и…

  • Алгоритм Ремеза в экселе

    Вот и до него руки дошли, причина станет ясна в следующем посте. Изучать чужие библиотеки было лениво (в том же BOOSTе сам чёрт ногу сломит), писать…

  • atan на ЧЕТЫРЁХ умножениях

    Мишка такой человек — ему обязательно надо, чтоб от всего была польза. Когда у него бывают лишние деньги, он идёт в магазин и покупает какую-нибудь…

  • Ай да Пафнутий Львович!

    Решил ещё немного поковыряться со своим арктангенсом. Хотел применить алгоритм Ремеза, но начал с узлов Чебышёва. И для начала со своего "линейного…

  • atan(y/x) на двух умножениях!

    Чего-то никак меня не отпустит эта тема, всё кажется, что есть очень простой и эффективный метод, надо только его найти! Сейчас вот такое…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 3 comments