Операция умножения матрицы на матрицу. Есть операция которая принимает на вход две матрицы и выдаёт одну.
Пусть даны две прямоугольные матрицы и
размерности
и
соответственно:
Тогда матрица размерностью
называется их
произведением
:
;
где:
.
Операция умножения двух матриц выполнима только в том случае, если число столбцов в первом сомножителе равно числу строк во втором; в этом случае говорят, что форма матриц согласована
. В частности, умножение всегда выполнимо, если оба сомножителя являются квадратными матрицами одного и того же порядка.
Следует заметить, что из существования произведения вовсе не следует существование произведения
.
Сочетательное свойство
:
;
.
Распределительное свойство
:
;
.
Произведение матрицы на единичную матрицу подходящего порядка равно самой матрице:
;
.
Произведение матрицы на нулевую матрицу подходящей размерности равно нулевой матрице:
;
.
Если и
— квадратные матрицы одного и того же порядка, то произведение матриц обладает ещё рядом свойств.
Умножение матриц в целом некоммутативно:
.
Если , то матрицы
и
называются перестановочными или коммутирующими между собой.
Определитель и след произведения не зависят от порядка умножения матриц:
;
.
Если матрица не вырождена, то у неё есть обратная матрица. Такая что произведение исходной и обратной даёт единичную матрицу.
.
Существует большое число алгоритмов умножения. И целый ряд быстрых алгоритмов основанных на группировки операций.
procedure Mul_Base(Var R:TMatrixNM; A:TMatrixNM; B:TMatrixNM); var i, j, k: Integer; N,M,Q:Integer; Tmp:Real; begin M:=RowsCount(A); N:=ColumnsCount(A); Q:=ColumnsCount(B); for i:=0 to M-1 do for j:=0 to Q-1 do begin Tmp:=0; for k:=0 to N-1 do Tmp:=Tmp+A[i,k]*B[k,j]; R[i,j]:=Tmp; end; end;
Входные параметры:
Выходные параметры:
Примечание:
Описание:
Идея алгоритма в том, что-бы ускорить умножения предварительно транспонировать вторую матрицу. Тогда обращение к элементам второй матрицы будет линейно по памяти, что даёт прирост. См. быстрый(блочный) алгоритм транспонирования.
Помимо ускорения за счёт более оптимального использования доступа к памяти. Возможно использовать аппаратное распараллеливание при помощи команд SIMD(одна инструкция много данных)для ускорения обработки, обрабатывая за раз 4 числа.
В DirectX матрицы мира и вида хранятся и задаются в транспонированном виде. Поэтому во время работы программы матрицы уже транспонированы и их не надо транспонировать.
procedure Transpose_Mul(Var R:TMatrixNM; A:TMatrixNM; B:TMatrixNM); var i, j, k: Integer; N,M,Q:Integer; Tmp:Real; C:TMatrixNM; begin if IsMatrixTranspose(B) then C:=B else FastTranspose(C,B); M:=RowsCount(A); N:=ColumnsCount(A); Q:=RowsCount(С); for i:=0 to M-1 do for j:=0 to Q-1 do begin Tmp:=0; for k:=0 to N-1 do Tmp:=Tmp+A[i,k]*C[j,k]; R[i,j]:=Tmp; end; end;
Строки:
Tmp:=0; for k:=0 to N-1 do Tmp:=Tmp+A[i,k]*C[j,k]; R[i,j]:=Tmp;
можно заменить векторным умножением
R[i,j]:=DotProduct(A[i],B[j]);
Строки:
if IsMatrixTranspose(B) then C:=B else FastTranspose(C,B);
Если на перёд известно, что матрица транспонирована, то достаточно вместо этих 2-х строк переименовать C в B.
;
;
;
;
Список литературы:
[1] http://ru.wikipedia.org/wiki/Умножение_матриц
[2] Р. Блейхут Быстрые алгоритмы цифровой обработки сигналов
[3] http://www.youtube.com/watch?v=llwuoLzPbdE
[4] http://msdn.microsoft.com/en-us/library/windows/desktop/bb206269(v=vs.85).aspx