Что такое порядок матрицы

Матрицы. Виды матриц

Матрицей называется прямоугольная таблица из чисел с некоторым количеством m строк и с некоторым количеством n столбцов. Числа m и n называются порядками или размерами матрицы.

Матрица порядка m × n записывается в форме:

или (i=1,2. m; j=1,2. n).

Числа aij входящие в состав данной матрицы называются ее элементами. В записи aij первый индекс i означает номер строки, а второй индекс j— номер столбца.

Матрица строка

Матрица размером 1×n, т.е. состоящая из одной строки, называется матрицей-строкой. Например:

Матрица столбец

Матрица размером m×1, т.е. состоящая из одного столбца, называется матрицей-столбцом. Например

Нулевая матрица

Квадратная матрица

Матрица A порядка m×n называется квадратной матрицей, если количество строк и столбцов совпадают: m=n. Число m=n называется порядком квадратной матрицы. Например:

Главная диагональ матрицы

Побочная диагональ матрицы

Диагональная матрица

Квадратная матрица называется диагональной, если элементы, расположенные вне главной диагонали равны нулю. Пример диагональной матрицы:

Единичная матрица

След матрицы

Сумма главных диагональных элементов матрицы A называется следом матрицы и обозначается Sp A или Tr A. Например:

Верхняя треугольная матрица

Нижняя треугольная матрица

Квадратная матрица порядка n×n называется нижней треугольной матрицей, если равны нулю все элементы матрицы, расположенные над главной диагональю, т.е. aij=0, при всех i T ).

Cтолбцы матрицы A образуют пространство столбцов матрицы и обозначаются через R(A).

Ядро или нуль пространство матрицы

Противоположная матрица

Для любой матрицы A сущеcтвует противоположная матрица -A такая, что A+(-A)=0. Очевидно, что в качестве матрицы -A следует взять матрицу (-1)A, элементы которой отличаются от элементов A знаком.

Кососимметричная (Кососимметрическая) матрица

Кососимметричной называется квадратная матрица, которая отличается от своей транспонированной матрицы множителем −1:

В кососимметричной матрице любые два элемента, расположенные симметрично относительно главной диагонали отличаются друг от друга множителем −1, а диагональные элементы равны нулю.

Пример кососимметрической матрицы:

Разность матриц

Разностью C двух матриц A и B одинакового размера определяется равенством

Для обозначения разности двух матриц используется запись:

Степень матрицы

Пусть квадратная матрица размера n×n. Тогда степень матрицы определяется следующим образом:

где E-единичная матрица.

Из сочетательного свойства умножения следует:

где p,q— произвольные целые неотрицательные числа.

Симметричная (Симметрическая) матрица

Матрица, удовлетворяющая условию A=A T называется симметричной матрицей.

Для симметричных матриц имеет место равенство:

Источник

ЧАВО по матрицам и кватернионам

Часто задаваемые вопросы по матрицам и кватернионам.

Введение

Замечание по поводу OpenGL и этого документа

В этом документе, как в большинстве книг по математике, все матрицы представлены в стандартном математическом виде. К сожалению, в уроках и документах по использованию графических библиотек типа IrisGL, OpenGL используют представление, в котором изменены местами столбцы и строки.

В этом документе, к примеру, матрица переноса 4×4 записывается в таком виде:

\(M = \begin 1 & 0 & 0 & X\cr 0 & 1 & 0 & Y\cr 0 & 0 & 1 & Z\cr 0 & 0 & 0 & 1\cr \end\)

В коде это можно записать вот так:

OpenGL использует одномерный массив для хранения матриц, но, к счастью, они находятся в памяти в таком виде, что получив адрес pfMatrix и скастовав его к float* можно увидеть матрицу в том виде, в каком ее передают в glLoadMatrixf.

Во фрагментах кода в этом документе используются одномерные массивы для хранения матриц. Порядок элементов в них транспонирован как в OpenGL.

Этот документ OpenGL
\(M = \begin 0 & 1 & 2 & 3\cr 4 & 5 & 6 & 7\cr 8 & 9 & 10 & 11\cr 12 & 13 & 14 & 15\cr \end\) \(M = \begin 0 & 4 & 8 & 12\cr 1 & 5 & 9 & 13\cr 2 & 6 & 10 & 14\cr 3 & 7 & 11 & 15\cr \end\)

Что такое матрица?

Матрица это двумерный массив чисел, где каждый ряд или колонка состоит из одного и более чисел.

Матрицы можно складывать, вычитать, умножать и делить.

Размер матрицы определяется количеством рядов и колонок.

Матрица с M рядов и N колонок описывается как матрица MxN.

Описать отдельный элемент матрицы можно в виде двух индексов.

Используя математическую нотацию индексы обозначают переменными i и j. Сначала пишут строку, затем колонку.

К примеру, если есть матрица M с порядком 4×4, то элементы этой матрицы описываются парами индексов строк и колонок:

\(M = \begin 00 & 10 & 20 & 30\cr 01 & 11 & 21 & 31\cr 02 & 12 & 22 & 32\cr 03 & 13 & 23 & 33\cr \end\)

У верхнего правого элемента матрицы i=0 и j=3, что можно описать так:
\(M_=M_<03>\)

В компьютерной анимации обычно используют матрицы 2×2, 3×3 и 4×4.

Матрицы 2×2 используются для двумерного пространства, например, для поворотов, сдвигов и других типов обработки изображений.

Матрицы 3×3 достаточны для хранения информации о повороте (вращении) и масшатбировании. Такие матрицы могут быть использованы для скелетной анимации.

Матрицы 4×3 достаточно, чтобы хранить поворот, масштабирование и перемещение.

Матрицы 4×4 используются для всего набора трансформаций в трёхмерном пространстве, включая перспективное проецирование.

Что такое порядок матрицы?

Порядок матрицы — это её размерность. Матрица из M строк и N столбцов имеет порядок MxN.

Как я могу сделать матрицу в C/C++?

Проще всего использовать ключевое слово typedef.

Матрицы 3×3 и 4×4 могут быть описаны так:

Так как матрицы имеют размерность 3×3 и 4×4, им необходимо 9 и 16 элементов соответственно.

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

Однако, использование двух систем отсчета для каждого элемента матрицы часто ведет к путанице. В математике, сначала записывают строку(i), а затем колонку(j): \(M_\)

В C/C++, это будет так:

Использование двумерных массивов также подействует на производительность процессора, так как компилятор C всегда использует операцию умножения для определения индекса элемента.

Так что, эффективнее использовать одномерные массивы. Однако останется решить ещё один вопрос. Как двумерный массив проецируется в линейный?

Есть только два решения: строка сначала, колонка потом, либо колонка сначала, а строка потом.

Разница в производительности минимальна. Если все циклы раскрыты, то нет практически отличий в производительности для таких операций как умножение матрицы на матрицу.

При использовании C/C++ порядок элементов в матрице следующий:

\(M = \begin 0 & 1 & 2 & 3\cr 4 & 5 & 6 & 7\cr 8 & 9 & 10 & 11\cr 12 & 13 & 14 & 15\cr \end\) \(M = \begin 0 & 1 & 2\cr 3 & 4 & 5\cr 6 & 7 & 8\cr \end\)

В чем плюсы от использования матриц?

Один из первых вопросов, задаваемых по использованию матриц в компьютерной анимации: «Зачем вообще они нужны?». Интуиция подсказывает, что придется хорошо потратиться на циклы, и тем самым матричные перемножения замедлят программу.

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

Также можно указать и на плюсы. Используя этот математический подход в описании 3D алгоритмов, можно предсказать и спланировать систему 3D анимации. Этот подход позволяет реализовать анимацию персонажа, сплайны и инверсную кинематику.

Но чаще всего звучит такой вопрос: «А не будет ли быстрее, просто умножить каждую пару координат на коэффициенты поворота для оси, вместо того чтобы производить полное векторно-матричное умножение?»

иначе говоря:
Вращение в X преобразует Y и Z
Вращение в Y преобразует X и Z
Вращение в Z преобразует X и Y

За это приводятся следующие аргументы:

Дана вершина V = (x, y, z), углы поворота (A,B и C) и перенос (D,E,F).

И следующий алгоритм:

Вместе они займут следующее количество процессорного времени:

Настройка На одну вершину
6 тригонометрических функций
6 присваиваний.
12 присваиваний
12 умножений
9 сложений

Те же самые операции, но при использовании матричного умножения.

С матрицей 4х4 они займут:

Настройка Изменение На одну вершину Изменение
6 тригонометрических функций 0 0
18 присваиваний -12 3 присваиваний -9
12 умножений +12 9 умножений -3
6 вычитаний +6 6 сложений -3

Сравнивая две таблицы, видно, что матрица поворота стоит как минимум 12 умножений и дополнительно 18 присваиваний.

Однако мы экономим на обработке вершин. Использование матричного умножения, от настройки всего 4 вершин, перевесит дополнительные затраты на настройке.

Как матрицы влияют на систему координат?

Матрицы поворота, переноса, сдвига очень просто действуют на систему координат.

Первые три колонки матрицы описывают направление осей X,Y,Z соответственно.

Если описана матрица 4х4 как:
\(M = \begin A & B & C & D\cr E & F & G & H\cr I & J & K & L\cr M & N & O & P\cr \end\)

Вектор направления для каждой оси будет следующий:

ось \(X = [ A E I]\)
ось \(Y = [ B F J ]\)
ось \(Z = [ C G K]\)

Источник

Математика для чайников. Матрицы и основные действия над ними

Определение матрицы

Матрица – это прямоугольная таблица элементов. Ну а если простым языком – таблица чисел.

Обычно матрицы обозначаются прописными латинскими буквами. Например, матрица A, матрица B и так далее. Матрицы могут быть разного размера: прямоугольные, квадратные, также есть матрицы-строки и матрицы-столбцы, называемые векторами. Размер матрицы определяется количеством строк и столбцов. Например, запишем прямоугольную матрицу размера m на n, где m – количество строк, а n – количество столбцов.

Что можно делать с матрицами? Складывать/вычитать, умножать на число, умножать между собой, транспонировать. Теперь обо всех этих основных операциях над матрицами по порядку.

Операции сложения и вычитания матриц

Сразу предупредим, что можно складывать только матрицы одинакового размера. В результате получится матрица того же размера. Складывать (или вычитать) матрицы просто – достаточно только сложить их соответствующие элементы. Приведем пример. Выполним сложение двух матриц A и В размером два на два.

Вычитание выполняется по аналогии, только с противоположным знаком.

Умножение матрицы на число

На произвольное число можно умножить любую матрицу. Чтобы сделать это, нужно умножить на это число каждый ее элемент. Например, умножим матрицу A из первого примера на число 5:

Операция умножения матриц

И пример с реальными числами. Умножим матрицы:

Операция транспонирования матрицы

Транспонирование матрицы – это операция, когда соответствующие строки и столбцы меняются местами. Например, транспонируем матрицу A из первого примера:

Определитель матрицы

Определитель, о же детерминант – одно из основных понятий линейной алгебры. Когда-то люди придумали линейные уравнения, а за ними пришлось выдумать и определитель. В итоге, разбираться со всем этим предстоит вам, так что, последний рывок!

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

Определитель матрицы первого порядка, то есть состоящей из одного элемента, равен этому элементу.

А если матрица три на три? Тут уже посложнее, но справиться можно.

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

К счастью, вычислять определители матриц больших размеров на практике приходится редко.

Источник

Знакомство с матрицами

Понятие и базовые операции.

Разработчики нейросетей говорят, что все нейросети — это просто бесконечное перемножение матриц. Мы решили разобраться, что это за матрицы и как их перемножать, а для этого пришлось полезть в линейную алгебру. И это оказалось не так сложно, как мы думали:

Вектор — это «кирпичик» линейной алгебры. На его основе мы переходим к понятию матрицы.

Что такое матрица

Если вектор — это строка с числами в определённом порядке, то матрица — это таблица с числами в определённом порядке. Как у любой таблицы, у матрицы есть столбцы и строки. В них сидят какие-то числа. Всё вместе — это математический объект, то есть в каких-то случаях всю эту таблицу можно рассматривать как единое целое и совершать с ним операции.

Матрицы принято обозначать большими буквами латинского алфавита вроде А, В, С, D и так далее.

Числа внутри матрицы называют элементами. Каждый элемент обозначается двумя цифрами: первая цифра указывает на строку, а вторая — на столбец. Это адрес числа внутри матрицы. Например, элемент А₂₃ означает, что нужное число находится во второй строке и третьем столбце. Нумерация элементов нужна для записи формул и устного объяснения того, где находится нужное число в матрице.

В матрице может находиться неограниченное количество строк, столбцов и элементов. Из-за этого матрицы бывают разных видов и могут обладать разными особенностями. Например, если в матрице совпадает число строк и столбцов, то такая матрица называется квадратной.

В этой статье и в следующих материалах мы будем рассматривать разные виды матрицы и постепенно изучим их особенности.

Общая схема матрицы Пример квадратной матрицы с пятью строками и столбцами. Записывается как матрица размера 5×5. В числовой матрице мы не нумеруем элементы — они закрепляются за числами по умолчанию. Например, элементу А₂₃ соответствует число три

Простые операции с матрицами

Вынесение минуса за пределы матрицы. Если внутри матрицы у большинства элементов знак минус, то часто это мешает расчётам или приводит к ошибкам. Чтобы этого избежать, от минуса избавляются. Для этого нужно вынести минус за пределы матрицы и изменить знак всех элементов внутри самой матрицы.

И наоборот: если внутри матрицы у большинства элементов знак минус и перед матрицей стоит минус, то минус можно внести в матрицу.

Выносим минус за пределы матрицы и получаем вместо двадцати одного отрицательного элемента — четыре Перед матрицей минус, и внутри у большинства элементов минус. Вносим минус в матрицу и делаем её удобной для дальнейших вычислений

Умножение матрицы на число. Для умножения матрицы на число достаточно каждый элемент матрицы умножить на это число.

Пример умножения матрицы на число

Транспонирование матрицы. Это операция, которая позже нам понадобится для решения матричных уравнений. Для транспонирования мы берём известную матрицу, меняем в ней местами строки со столбцами и получаем новую матрицу. Как бы поставили матрицу набок.

⚠️ При этом в матрице запрещено в произвольном порядке менять элементы. Зато можно полностью менять местами строки или столбцы. Если мы поменяем местами первую и вторую строку, то это останется прежняя матрица.

Схема транспонирования матриц: первая строка переходит в первый столбец, вторая строка — во второй столбец и так далее в зависимости от количества элементов матрицы Пример транспонирования. Транспонированная матрица обозначается буквой той же матрицы, из которой она получилась + надстрочечный индекс в виде печатной буквы «Т» Матрицу можно перетасовывать, но это нужно делать по правилам. Транспонирование — одно из таких правил

Сложение и вычитание матриц

Если в нескольких матрицах совпадает число строк и столбцов, то мы можем их складывать и вычитать. Для вычислений нам нужно поэлементно сложить или вычесть каждый элемент матриц: первый элемент первой матрицы складываем с первым элементом второй матрицы или вычитаем из него и так далее. В результате получаем новую матрицу.

Пример сложения двух прямоугольных матриц с тремя строками и двумя столбцами Пример вычитания двух матриц

Умножение матриц

Матрицы умножаются по принципу строка на столбец. Мы умножаем первую строку первой матрицы, на первый столбец второй матрицы, складываем результаты и получаем первый элемент новой матрицы. По аналогичной схеме вычисляем все остальные элементы. Звучит запутанно, поэтому идём по шагам:

Если нам нужно найти матрицу в квадрате, то мы умножаем эту матрицу на саму себя. Если нужна матрица в кубе — умножаем её на саму себя три раза и так далее в зависимости от количества степеней. Если в одной из матриц все элементы нули, то она считается нулевой и после умножения на другую матрицу даёт нулевую матрицу — это как нуль умноженный на число всегда даёт нуль.

Формула умножения матриц Пример умножения квадратных матриц размерностью 2×2

Что дальше

В следующий раз продолжим знакомиться с базовыми понятиями, которые нам понадобятся для решения матричных уравнений. А на сегодня Нео свободен 👽

Источник

Статьи для программистов. Переводы.


Вступление


I1.Важное замечание относящееся к OpenGL и этому документу

В этом документе (как и в большинстве книг по математике), все матрицы выведены на стандартный математический манер. К сожалению, графические библиотеки, такие как IrisGL, OpenGL используют матрицы, в которых ряды и столбцы поменялись местами.

Следовательно, в этом документе вы увидите, например, 4х4 матрицу перемещения, представленную как здесь:

Эту матрицу мог бы заполнить, например, такой код:

т.е матрица была бы сохранена в таком массиве:

В отрывках кода повсюду в этом документе для сохранения матриц используется одномерный массив. Порядок элементов массива, по сравнению с OpenGL изменён.

Ответы на вопросы


Основы


Q1. Что такое матрицы?

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

Размер матриц определяется в терминах числа рядов и столбцов.

Матрица с M рядами и N столбцами определена как матрица MxN.

Индивидуальный элемент матрицы обозначают, употребляя два индексных значения. Используя математическую нотацию, обычно назначают переменные ‘i’ (номер ряда) и ‘j’(номер столбца).

Например, в матрице 4х4 элементы индексируются так:

Элемент в правом верхнем углу матрицы имеет индексы i = 0 и j = 3. Такой элемент обозначают так:

В компьютерной анимации наибольшее употребление имеют матрицы по 2, 3 или 4 ряда и столбца. Их обозначают соответственно как матрицы 2х2, 3х3 и 4х4.

Матрицы 2х2 употребляются для совершения операций вращения, сдвига и других типов создания изображения. Универсальные NxN матрицы могут быть использованы для совершения процессов создания изображений, таких, как свертывание.

Матрицы 3х3 употребляются для создания низкозатратной 3-х мерной анимации. Такие операции, как вращение и умножение могут быть совершены с этими матрицами, но перспективные преобразования могут быть выполнены, с использованием стандартных операций деления.

Матрицы 4х4 употребляются для создания высококачественной трёхмерной анимации. Операции, такие, как умножение и создание перспективы могут быть совершены при помощи матричной математики.

Q2. Что такое «порядок» матрицы?


Q3. Как должен я представлять матрицы используя язык программирования C/C++?

Поскольку каждый тип матриц имеет размерность 3х3 и 4х4, это требует соответственно 9 и 16 элементов.

С первого взгляда употребление одномерного массива может показаться нелогичным. Более удобным может показаться употребление двумерного массива т.е:

Однако употребление таких массивов очень часто ведёт к путанице. В математике сначала идут ряды (i), затем столбцы (j), т.е.:

В языке C/C++ такая матрица принимает вид:

Кроме того, употребление двумерного массива уменьшает производительность процессора.

Итак, более эффективно использование одномерного массива. Однако ещё остаются некоторые вопросы, требующие разъяснения. Как двумерную матрицу поместить в одномерный массив? Имеются два способа (сначала ряды/затем столбцы или сначала столбцы/затем ряды).

Разница между этими двумя способами тонкая. Если распутать все циклы, тогда обнаружится маленькая разница в таких операциях, как матричное уиножение.

В языке программирования C/C++ линейный порядок каждой матрицы следующий:

Q4. Какое преимущество даёт использование матриц?

Преимущества также могут быть отмечены. Математический подход, определяющий алгоритмы 3-х мерной графики, позволяет предсказывать и планировать разработку 3-х мерных анимированных приложений. Такое математическое моделирование позволяет выполнять анимацию персонажей, анимацию по линии сплайна, инверсную кинематику.

То есть:
Вращение вокруг оси X заменить на перемещение в плоскости YZ
Вращение вокруг оси Y заменить на перемещение в плоскости XZ
Вращение вокруг оси Z заменить на перемещение в плоскости XY

Аргументы за это такие, как ниже:

Дана вершина V = (x, y, z), углы вращения (A, B и C) и смещение (D, E, F). Алгоритм преобразования такой:

Выполнение этого алгоритма требует таких затрат процессорного времени:

Предположим теперь, что те же самые операции были совершены с помощью матричного умножения.

С матрицей 4х4 затраты процессорного времени будут такими:

Сравнивая эти две таблицы может показаться, что употребление матриц требует дополнительных затрат процессорного времени, а именно, 12 умножений и 18 присваиваний.

Однако, как бы это не казалось невероятным, происходит экономия процессорного времени благодаря сокращению затрат на повершинные операции. При матричном перемножении времени тратится меньше уже при преобразовании координат 4 вершин.

Q5. Как матрицы соотносятся с системами координат?

Между каждой 3х3 или 4х4 матрицами вращения, перемещения, или сдвига и результирующей координатной системой существует простое соотношение.

Первые три столбца матрицы определяют направление осей X, Y и Z соответственно.

Если матрица 4х4 определена, как:

Тогда векторы, задающие направление каждой из осей, определяются так:

Арифметика


Q6. Что такое единичная матрица?


Q7. Что такое главная диагональ матрицы?

В случае единичной матрицы только элементы главной диагонали имеют значение 1, в то время, как остальные имеют значение 0.

Q8. Что такое транспонированная матрица?

Такая операция математически выражается так:

Однако, такая операция возможна только если матрица имеет одинаковое число рядов и столбцов.

Если матрица определена как:

Тогда транспонированная матрица эквивалентна такой:

Q9. Как я должен складывать две матрицы друг с другом?

Правило сложения матриц такое:

«прибавляй ряды и столбцы к рядам и столбцам»

Математически это может быть выражено так:

Однако, обе матрицы должны иметь одну и ту же размерность.

Например, если 3х3 матрицу M сложить с 3х3 матрицей L, тогда результат будет такой:

Q10. Как я должен вычитать одну матрицу из другой?

Правило вычитания двух матриц такое:

«вычитай ряды и столбцы из рядов и столбцов».

Математически это может быть выражено так:

Однако, обе матрицы должны иметь одну и ту же размерность.

Например, если 3х3 матрица L вычитается из 3х3 матрицы M, тогда результат будет такой:

Q11. Как должен я перемножать матрицы?

Правило перемножения матриц такое:

«умножай ряд на столбец и суммируй результат».

Математически это может быть выражено так:

Если две перемножаемые матрицы имеют такой порядок:

Результирующая матрица тогда будет иметь порядок AxD.

Таким образом, возможно, например, перемножение матриц Nх4 и 4хМ, но нельзя перемножить матрицы 4хN и Mх4.

Например, если 4х4 матрица M определена как:

а 4х2 матрица L определена как:

Тогда размер результирующей матрицы будет 4х2. Результирующая матрица определяется так:

Q12. Как я должен возводить матрицу в квадрат и в степень?

Матрица может быть возведена в квадрат или целую степень. Однако, имеется несколько ограничений. Для всех степеней матрица должна иметь одинаковое число рядов и столбцов.

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

При возведении единичной матрицы в любую степень всегда в результате получаем единичную матрицу, т.е.:

Q13. Как должен я умножать один или несколько векторов на матрицу?

Если N векторов нужно перемножить с матрицей 4х4, тогда их можно представить в виде единственной матрицы 4хN:

Если матрица определена как:

И список векторов такой:

Обратите внимание, что добавлен дополнительный ряд, каждый элемент которого равен 1.0. Реально таких элементов не существует. Они добавлены только для того, чтобы совпал порядок матрицы и списка векторов.

Затем совершается умножение как ниже:

На каждый вектор в списке всего приходится 12 умножений, 16 сложений и 1 деление (для построения перспективы).

Определители и обратные матрицы


Q14. Что такое определитель (детерминант) матрицы?

В качестве примера рассмотрим матрицу, содержащую один-единственный элемент:

Для матрицы такого размера детерминант просто равен этому элементу.

Если единственный элемент матрицы не равен нулю, тогда (обращение) инвертирование возможно. В случае, если матрица единичная её обращением (инвертированием) будет 1/1 или 1.0.

Однако, если значение единственного элемента такой матрицы равно нулю, тогда определитель тоже равен нулю.

При попытке вычислить величину, обратную нулю, получаем бесконечность. Итак, инвертирование матрицы с нулевым детерминантом не определено.

У единичной матрицы определитель всегда равен единице. Любая матрица, определитель которой равен 1.0, называется изотропной.

Таким образом, все матрицы вращения изотропны, поскольку их детерминант равен 1.0.

Это можно доказать так:

Q15. Как я могу вычислить определитель матрицы?

Определитель матрицы вычисляется по правилу Крамера.

Для матрицы 2х2 определитель вычисляется так:

Для матриц 3х3 и 4х4 потребуются более сложные вычисления, по методу Крамера.

Q16. Что такое изотропная и анизотропная матрицы?

Изотропная матрица эта та, у которой сумма квадратов всех рядов или столбцов равна единице.

Все остальные матрицы считаются анизотропными.

Когда 3х3 или 4х4 матрицы употребляются для вращения или масштабирования объекта, иногда необходимо вытянуть или уменьшить одну из осей.

К примеру, при сейсмических исследованиях удобно удлинять Z-ось на 50 и более процентов, оставляя оси X и Y без изменений.

Другой пример — «сжатие» и «вытягивание» персонажей анимации. Когда какой-либо объект «расплющивают на наковальне» желаемый эффект можно получить вытягивая его по сторонам и сжимая по вертикали.

Подходящая для этого матрица может быть такой:

Однако, тут появляются проблемы. Правильно производя трансформацию вершин, такая матрица вызывает неправильное наложение теней при употреблении нормалей.

Из-за того, что трансформацию сцены выполняют посредством матричного умножения, данные как вершин, так и нормалей перемножаются с этой матрицей.

Корректно трансформируя вершины, мы получаем головную боль с данными нормалей.

После «сырого» перемножения, каждая нормаль больше не будет иметь единичную длину, и, следовательно, это затронет и другие вычисления, такие, как расчет теней и оттенков и отсечение невидимых граней.

Q17. Что такое инвертированная матрица?

Таким образом, перемножение матрицы с ей обратной, генерирует единичную матрицу. Однако, чтобы была возможна инверсия, исходная матрица должна удовлетворять некоторым требованиям.

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

Q18. Как могу я произвести инвертирование произвольной матрицы?

В зависимости от размера матрицы её инвертирование может быть как очень простой, так и чрезвычайно сложной операцией.

Например, чтобы инвертировать матрицу 1х1 надо просто найти величину, обратную единственному элементу матрицы:

Тогда обращение определяется, как:

Что касается матриц порядка 2х2 и выше, их обращение может быть достигнуто использованием правила Крамера или решением ряда систем уравнений.

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

Q19. Как я должен вычислять матрицу, обратную единичной?

Всякая единичная матрица имеет определитель равный единице.

Q20. Как я должен вычислять матрицу, обратную матрице вращения?

Поскольку матрица вращения всегда имеет определитель равный +1, вычисление ей обратной эквивалентно вычислению транспонированной матрицы.

Кроме того, если углы вращения известны, тогда эти углы могут быть заменены на отрицательные и использованы для вычисления новой матрицы вращения.

Q21. Как я должен инвертировать матрицу по правилу Крамера?

Возьмём матрицу 3х3:

Её определитель вычисляется так:

где подматрица i j сформирована из всех рядов и столбцов матрицы M, за исключением ряда i и столбца j. Подматрица i j может вызываться рекурсивно.

Q22. Как я должен инвертировать 2х2 матрицу?

Для матрицы 2х2 вычисления немного труднее. Если матрица определена как:

Тогда её определитель вычисляется так:

И обращение производят следующим образом:

Это может быть проверено с помощью правила Крамера. Дана матрица M:

Тогда её определитель есть:

И обращение производится так:

Тогда обратная матрица будет такой:

при условии, что её определитель не равен нулю.

Q23. Как я должен инвертировать 3х3 матрицу?

Для матриц порядка 3х3 и выше обратная матрица может быть вычислена с помощью правила Крамера или решением системы линейных уравнений.

Если применить правило Крамера к матрице M:

тогда определитель вычисляется так:

Если определитель не равен нулю, тогда обратная матрица вычисляется так:

Q24. Как я должен инвертировать матрицу 4х4?

Так же, как и матрицу 3х3, или применив правило Крамера, или решив систему линейных уравнений.

Лучше всего использовать существующие C-функции, предназначенные для вычисления определителей и обращения 3х3 матриц.

Для того, чтобы произвести вычисления по правилу Крамера, сначала необходимо определить подматрицы. Это делает следующая функция:

Определитель матрицы 4х4 может быть вычислен так:

И обратная матрица может быть вычислена как здесь:

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

Q25. Как могу я вычислить обратную матрицу с помощью линейных уравнений?

Если имеется такая матрица M:

тогда обратная ей пусть будет такой:

и верны следующие выражения:

Обратная матрица тогда может быть вычислена решением следующих систем уравнений:

Трансформации


Q26. Что такое матрица вращения?

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

Для двумерной системы координат матрица вращения такая:

Если в такой матрице установить угол A = 0, тогда получим единичную матрицу.

Если необходимо произвести вращение на +90 градусов, тогда матрица должна быть такой:

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

Если одну матрицу вращения перемножить с другой, полученной из первой транспонированием, результатом будет единичная матрица.

Q27. Как связана матрица вращения с координатной системой?

Матрицы вращения соотносятся с системой координат так.

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

Применяя это правило, можно вывести три Декартовы матрицы вращения. Рассмотрим правостороннюю систему координат. Для каждой оси вращения, смотря от начала системы координат, вдоль положительного направления выбранной оси, получим три таких вида:

Поскольку положительным углом вращения считается угол произведённый по часовой стрелке, то возможно произвести отображение координат для любого вращения. Для простоты, будем считать, что угол вращения равен +90 градусам:

Это может быть упрощено:

И затем преобразовано в матрицу:

Сделаем то же самое для оси Y:

Преобразуем в матрицу:

И, наконец, для оси Z:

Преобразовываем в матрицу:

Это три основные матрицы вращения, используемые в OpenGL.

Q28. Какую матрицу я должен применять для произведения вращения вокруг оси X?

Используйте такую матрицу:

Q29. Какую матрицу я должен применять для произведения вращения вокруг оси Y?

Используйте такую матрицу:

Q30. Какую матрицу я должен применять для произведения вращения вокруг оси Z?

Используйте такую матрицу:

Q31. Что такое углы Эйлера?

Они определены в векторном формате (напр. |x y z|) и могут быть сохранены как вектор (т.е одномерный массив).

| 0 0 0 | всегда генерирует единичную матрицу.

Другие углы представлены так:

| 90 0 0 | вращение на +90 градусов вокруг оси X,

| 0 90 0 | вращение на +90 градусов вокруг оси Y и

| 0 0 90 | вращение на +90 градусов вокруг оси Z.

Каждый из Эйлеровых углов может быть представлен в памяти как векторная структура данных.

Вообразите, что вы видите впереди и ниже себя самолёт.

Ось Z проходит от хвоста к носу самолёта. Ось X идёт от конца левого крыла к концу правого.

Ось Y направлена снизу прямо вверх.

Q33. Как могу я комбинировать матрицы вращения?


Q34. Что такое «Шарнирный замок» («Gimbal lock»)?

Даже хуже, может быть невозможно вращать объект вокруг желаемой оси. Вот это и есть «Шарнирный замок».

В этом случае вращение вокруг оси Z происходит первым и, поэтому, корректно. Вращение вокруг оси Y тоже совершается корректно. Однако после вращения вокруг оси Y на 90 градусов, ось X отображается на ось Z.

Таким образом, совершая вращение вокруг (относительной) X-оси мы фактически вращаем объект вокруг (абсолютной) оси Z.

Q35. Как правильно комбинировать матрицы вращения?

На самом деле не существует «правильного способа» комбинации матриц. Однако, чтобы быть в состоянии предсказать результат комбинации матриц, некоторая организация необходима.

Однако, всякий раз, когда вид из камеры пересчитывается, тогда порядок и углы вращения полностью изменяются

Например, если вы стоите прямо и поворачиваетесь налево, то всё вокруг в вашем поле зрения поворачивается вокруг вас направо.

Однако, кто-нибудь, стоящий лицом к лицу с вами может сказать, что это вы повернулись направо.

Таким образом, вид из камеры моделируется в таком порядке:

Обратная (или транспонированная) матрица необходима, если камера представлена как другой объект.

Q36. Как могу я получить матрицу из Эйлеровых углов?

Всё это может быть скомпоновано в одной функции, напр.:

Однако, выполнение такой последовательности требует больших затрат процессорного времени.

Принимая во внимание, что каждая 4х4 матрица вращения гарантированно имеет 10 элементов, значение которых равно нулю, 2 элемента, равные единице, и 4 элемента, имеющие произвольные значения, окажется, что свыше 75% арифметических операций, совершаемых при перемножении матриц, совершенно не нужны. (Не считая операций присваивания.)

При выполнении свыше 75% всех матричных операций, в результате получаем или ноль или единицу.

Должен быть найден более эффективный способ. К счастью, такой способ, позволяющий определить результирующую матрицу, существует.

Если все три матрицы объединить на алгебраический манер, то получим следующее выражение:

Выводя матрицы вращения в алгебраическом формате, получим:

где
A, B косинус и синус угла вращения вокруг оси X,
C, D косинус и синус угла вращения вокруг оси Y,
E, F косинус и синус угла вращения вокруг оси Z,

Может быть разбито на два матричных умножения:

Сначала вычислим матрицу M’:

Упрощение M даёт матрицу 3х3:

Это и есть результирующая матрица вращения. В виде матрицы 4х4 это будет:

Сначала вычисляются значения A, B, C, D, E и F. Затем значения BD и AD, поскольку они встречаются больше, чем один раз.

Таким образом, конечный алгоритм будет таким:

При использовании обычного матричного умножения, количество арифметических операций может достигать 128 умножений, 96 сложений и 80 присваиваний.

При использовании же оптимизированного алгоритма требуется всего только 12 умножений, 6 вычитаний и 18 присваиваний.

Q37. Как должен я конвертировать матрицу вращения в углы Эйлера?

Эта операция прямо противоположна вышеизложенной. Предположим, что дана такая матрица вращения:

где
A, B косинус и синус угла вращения вокруг оси X,
C, D косинус и синус угла вращения вокруг оси Y,
E, F косинус и синус угла вращения вокруг оси Z,

Используя структуру данных языка C для матрицы 4х4, получим такие индексы элементов массива:

Сами углы могут быть получены делением каждой пары значений на C с последующей передачей результатов функции atan().

Здесь имеет место т. н. «Шарнирный замок» («Gimbal Lock»). Вращение вокруг осей Х и Z отображается как вращение вокруг одной и той же оси. Это можно увидеть, вычисляя оси вращения.

Дальнейшие вычисления дают:

И после перестановки:

Тогда можно увидеть, что на самом деле матрица имеет такую форму:

Где
V = BE-AF и
W = AE+BF

Эти два значения можно рассматривать, как синус и косинус углов вращения вокруг единственной оси.

В окончательном виде алгоритм будет таким:

Q38. Как могу я сгенерировать матрицу для произвольной оси и угла вращения?


Q39. Как могу я сгенерировать матрицу вращения, чтобы отобразить один вектор на другой?

При разработке программ с анимацией, постоянно возникает необходимость отобразить один направляющий вектор на другой.

Теоретически, имеется бесчисленное множество осей и углов вращения, отображающих один вектор на другой. Все эти оси лежат в одной плоскости, все точки которой имеют равное расстояние от обоих векторов.

Но только одно решение имеет практический интерес. Это кратчайшее угловое расстояние между векторами.

Ось вращения находим, вычисляя векторное произведение заданных векторов:

Угол вращения вычисляется с помощью скалярного произведения векторов:

На практике решение этой задачи используют для нахождения кратчайшего пути между двумя пунктами на поверхности Земли. В этом случае каждый из пунктов считается лежащим на концах радиус-векторов. Поскольку Земля имеет сферическую форму, искомый путь есть кратчайшее угловое расстояние между двумя этими пунктами.

Q40. Как должен я употреблять матрицы для конвертирования одной системы координат в другую?

Эта проблема решается примерно так же, как предыдущая. Требуется преобразовать одну координатную систему в другую. Однако, вместо того, чтобы просто пытаться отобразить одну координатную ось на другую, необходимо добиться соответствия всех трёх осей. Следовательно, обе координатные системы представлены в виде матриц 3х3 или 4х4.

Таким образом, проблема состоит в нахождении матрицы вращения, которая преобразует одну матрицу в другую. Математически это может быть выражено так:

Цель состоит в нахождении матрицы Mrot. Это может быть достигнуто перестановкой уравнения:

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

Вычисленная матрица вращения может быть конвертирована в кватернион.

Q41. Что такое матрица смещения (переноса)?

Матрица смещения используется для позиционирования объекта в трёхмерном пространстве, без какого-либо вращения. Операция смещения в матричном исполнении возможна только с матрицей 4х4.

Если смещение определено вектором [ X Y Z ], тогда матрица 4х4, выполняющая смещение, такая:

Q42. Что такое матрица масштабирования?

Матрица масштабирования используется для уменьшения или увеличения 3-х мерной модели.

Если масштабирующий вектор определён, как [X Y Z] тогда матрица масштабирования такая:

Если масштабирующий вектор определён, как [1 1 1], тогда генерируется единичная матрица, и никаких изменений не происходит.

Q43. Что такое матрица сдвига?

Матрица сдвига используется для наклона 3-х мерных моделей в сторону. К примеру, для получения курсивного шрифта необходимо наклонить направо каждый отдельный символ шрифта (глиф).

Имея три направления по осям XYZ можно произвести шесть операций сдвига:

# сдвиг X вдоль Y
# сдвиг X вдоль Z
# сдвиг Y вдоль X
# сдвиг Y вдоль Z
# сдвиг Z вдоль X
# сдвиг Z вдоль Y

Все эти операции могут быть скомбинированы в одну-единственную матрицу:

в которой Sij выполняет сдвиг I вдоль J.

Таким образом, Sxy сдвигает X вдоль Y.

Согласно теории, вращение в трёхмерном пространстве можно рассматривать как комбинацию сдвигов в шести направлениях.

Q44. Как должен я производить линейную интерполяцию двух матриц?

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

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

Интерполяция между этими двумя векторами может быть совершена с помощью стандартного уравнения линейной интерполяции:

Это уравнение может применяться как с векторами вращения, так и с векторами переноса.

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

Q45. Как должен я производить кубическую интерполяцию четырех матриц?

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

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

Каждый комплект из четырёх векторов затем конвертируется в единственный вектор G. При помощи сплайновой математики, этот вектор преобразуется в M-матрицу интерполяции.

Если вектор G определён как:

тогда перемножение с базовой матрицей:

сгенерирует 3х4 матрицу интерполяции Mi:

Это может быть выполнено при помощи стандартного матрично-векторного перемножения.

Интерполяция тогда может совершаться с помощью параметрической переменной t:

Результирующий вектор затем может быть конвертирован в матрицу вращения или смещения.

Следует обратить внимание на то, что полученный путь может быть довольно извилист. Это нормально, поскольку алгоритм пытается найти кратчайшую сумму вращений между всеми четырьмя векторами.

Из двух методов сферические углы вращения обычно обеспечивают более плавную интерполяцию.

Q46. Как я могу отображать изменения в матрице?

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

Однако, отображение матрицы, как массива числовых значений не обеспечивает достаточной наглядности.

Матрица 3х3 могла бы выглядеть примерно так:

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

Кватернионы


Q47. Что такое кватернионы?

Кватернионы расширяют понятие вращения в трёх измерениях на вращение в четырёх измерениях. Они разрешают проблему т. н. (буквально: «шарнирный замок») и позволяют выполнить плавное и непрерывное вращение.

В действительности они могут считаться дополнением к углам вращения в сферических координатах, т. е. широте, долготе и угла вращения.

Кватернионы определяются четырьмя действительными числами [x y z w].

Они вычисляются из комбинации трёх координат, оси и угла вращения.

Q48. Как работают кватернионы с трёхмерной анимацией?

Как ранее отмечено, Эйлеровы углы имеют недостаток из-за подверженности «Gimbal-lock», когда попытка последовательного вращения объекта вокруг осей в заданном порядке терпит неудачу.

Кватернионы решают эту проблему. Вместо того, чтобы задавать вращение объекта как серию последовательных вращений, кватернионы позволяют программисту вращать объект вокруг произвольной оси на произвольный угол.

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

Благодаря тому, что ось вращения определена как единичный вектор, это может быть вычисленно с помощью векторной алгебры или сферических координат (т.е. Широты/Долготы).

Кватернионы предоставляют другие преимущества, так как они могут быть интерполированы. Это позволяет сделать плавные и предсказуемые повороты.

Q49. Как я должен вычислять сопряженный кватернион?

Это можно сделать, изменяя знаки чисел векторной части кватерниона, т. е.:

Q50. Как я должен вычислять обратный кватернион?

Точно так же, как и сопряженный кватернион. (см. Q49)

Q51. Как я должен вычислять величину кватерниона?

Величина кватерниона может быть вычислена перемножением кватерниона с сопряженным с ним кватернионом т.е.:

Это может быть выполнено как в следующем коде:

Q52. Как я должен нормализовать кватернион?

Кватернионы могут быть нормализованы таким же способом, как и векторы. Сначала вычисляется величина кватерниона. Затем векторная и скалярная части кватерниона делятся на это значение.

Единичный кватернион всегда имеет величину равную 1.0.

Q53. Как я могу перемножить два кватерниона друг с другом?

Для этого нужно вычислить такое выражение:

Это выполняет следующий сегмент кода:

Q54. Как должен я конвертировать кватернион в матрицу вращения?

Допустим, что кватернион был создан в следующей форме:

Тогда кватернион может быть преобразован в 3х3 матрицу вращения с помощью следующих выражений:

Если нужна матрица 4х4, то нужно заполнить нижний и крайний правый ряды.

Такую матрицу может сгенерировать следующий фрагмент кода:

Q55. Как должен я конвертировать матрицу вращения в кватернион?

Следующий алгоритм производит конвертирование вращения в кватернион:

Процесс вычисления разбит на следующие ступени:

Вычисляется сумма Т элементов главной диагонали матрицы:

Если Т больше, чем ноль тогда мгновенно получаем:

Если Т меньше или равно нулю тогда находим, наибольший элемент главной диагонали матрицы:

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

Кватернион тогда определяется как:

Q56. Как должен я конвертировать ось вращения и угол в кватернион?

Даны ось вращения и угол, следующий алгоритм генерирует кватернион:

Необходимо нормализовать кватернион в случае, если какие-нибудь значения очень близки к нулю.

Q57. Как должен я конвертировать кватернион в ось вращения и угол?

Следующий алгоритм конвертирует кватернион в ось вращения и угол:

Q58. Как должен я конвертировать сферические углы вращения в кватернион?

Сама ось вращения сама может быть определена сферическими координатами (Широтой и Долготой) и углом вращения.

В этом случае кватернион может быть вычислен так:

Q59. Как должен я конвертировать кватернион в сферические углы вращения?

Следующий процесс преобразовывает кватернион в сферические координаты :

Q60. Как должен я конвертировать Эйлеровы углы вращения в кватернион?

Преобразование Эйлеровых углов вращения в кватернион может быть достигнуто путём перемножения кватернионов. Каждый угол вращения преобразовывается в пару ось-угол, с осью соответствующей одной из осей Евклидовой системы координат. Пары ось-угол преобразуется в кватернион и перемножаются. Результат последнего умножения есть искомый кватернион.

Это демонстрирует следующий отрывок кода:

Q61. Как должен я употреблять кватернионы для выполнения линейной интерполяции матриц?

Для многих программ с анимацией необходимо интерполировать положение данного объекта между двумя заданными позициями. Эти позиции могут быть определены контрольными точками.

Для любого метода интерполяции должны быть известны по крайней мере две матрицы вращения и желаемый результат интерполируется между этими матрицами.

Эти две матрицы называют стартовой и финишной (MS and MF).

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

При Т=0 промежуточная матрица равна стартовой матрице.

При Т=1 промежуточная матрица равна финишной матрице.

Тогда промежуточная матрица вращения определяется как:

Это достигается использованием следующего выражения:

Для того, чтобы сгенерировать промежуточную матрицу вращения необходимо только измерять угол поворота и конвертировать этот угол и ось вращения назад, в матрицу вращения.

При использовании библиотечной матрицы 4х4 делайте так:

Q62. Как должен я употреблять кватернионы для совершения кубической интерполяции матриц?

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

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

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

Затем они перемножаются с базовой матрицей Основной сплайновой кривой. Эти интерполированные матрицы потом могут употребляться для определения промежуточных сферических углов вращения.

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

При использовании библиотечной матрицы 4х4 делайте так:

Источник

Читайте также:  Что такое глутамат натрия
Информационный сайт