Войти
ПрограммированиеFAQГрафика

Быстрый способ обращения матрицы преобразования координат

Исходную 4x4 матрицу можно представить в виде
  image002 | Быстрый способ обращения матрицы преобразования координат                                                      (1)
где  a11 - 3x3 матрица поворота.
Метод обращения матрицы преобразования координат использует свойство ортогональности  3x3 матрицы поворота a11 , это свойство выражается в том, что
  image006 | Быстрый способ обращения матрицы преобразования координат                                                        (2)
Нужно найти
  image008 | Быстрый способ обращения матрицы преобразования координат                                                        (3)
Имеем очевидное тождество
  image010 | Быстрый способ обращения матрицы преобразования координат                                                 
где E – еденичная матрица
Отсюда
  image012 | Быстрый способ обращения матрицы преобразования координат
распишем компоненты
  image014 | Быстрый способ обращения матрицы преобразования координат                                                      (4a) 
  image016 | Быстрый способ обращения матрицы преобразования координат                                                      (4b)
  image018 | Быстрый способ обращения матрицы преобразования координат                                                    (4c)
  image020 | Быстрый способ обращения матрицы преобразования координат                                                      (4d)
из (4b)следует
  image022 | Быстрый способ обращения матрицы преобразования координат
отсюда
  image024 | Быстрый способ обращения матрицы преобразования координат                                                    (5)
поскольку принято
  image026 | Быстрый способ обращения матрицы преобразования координат
из (4c) следует
  image028 | Быстрый способ обращения матрицы преобразования координат                                                    (6)
отсюда подставив (5) в (4d) получим
  image030 | Быстрый способ обращения матрицы преобразования координат                                                    (7)
Таким образом окончательно можно записать для обратной к A матрице
  image032 | Быстрый способ обращения матрицы преобразования координат                                                    (8)
Здесь для вычисления обратной матрицы необходимо
1.  Транспонирование матрицы 3x3 a11
2.  Два перемножения транспонированной 3x3 a11 на вектора размером 3.
3.  Скалярное перемножение двух векторов размером 3.
Всего 2*(9+1)+3+1=24 умножений, что будет в 3 раза меньше чем прямым методом обращения матрицы. Но реальный выигрыш в скорости по видимому будет больше, поскольку в алгоритме не используются сравнения и он легко распаралеливается.

Решение можно еще сильнее упростить, если воспользоваться тем, что в матрице перемещений практически используются только такие значения

        image034 | Быстрый способ обращения матрицы преобразования координат
тогда

          image036 | Быстрый способ обращения матрицы преобразования координат                                                                          (9)

Ниже представлена функция   InvertTranspositionsMatrix, обращающая матрицу по этой формуле. В ней используется только 9 умножений.

 

template <class T, const long nDim>
void MatrixT_Ar  <T, nDim>::InvertTranspositionsMatrix ()
{
     //Быстрый метод вычисление обратной матрицы к матрице перемещения 4x4
     //Написана и отлажена 12.05.06
     //вход исходная матрица, выход - обращенная матрица, в той же области памяти 

     //Транспонирование левой верхней 3x3 матрицы
     swap (a[1][0], a[0][1]);
     swap (a[2][0], a[0][2]); swap (a[2][1], a[1][2]);   

     //Вычисления нижнего вектора-строки
     T v0 = a[0][0] * a[3][0] + a[1][0] * a[3][1] + a[2][0] * a[3][2];
     T v1 = a[0][1] * a[3][0] + a[1][1] * a[3][1] + a[2][1] * a[3][2];
     T v2 = a[0][2] * a[3][0] + a[1][2] * a[3][1] + a[2][2] * a[3][2];
     a[3][0] = -v0;
     a[3][1] = -v1;
     a[3][2] = -v2; 
}

#математика, #матрицы

12 мая 2006

Комментарии [1]