Операция умножения матрицы на матрицу. Есть операция которая принимает на вход две матрицы и выдаёт одну.
===== Определение =====
Пусть даны две прямоугольные матрицы и размерности и соответственно:\\
\\
Тогда матрица размерностью называется их ''произведением'':\\
;\\
где:\\
.
Операция умножения двух матриц выполнима только в том случае, если число столбцов в первом сомножителе равно числу строк во втором; в этом случае говорят, что форма матриц ''согласована''. В частности, умножение всегда выполнимо, если оба сомножителя являются квадратными матрицами одного и того же порядка.
Следует заметить, что из существования произведения вовсе не следует существование произведения .
===== Свойства =====
''Сочетательное свойство'':\\
;\\
.\\
''Распределительное свойство'':\\
;\\
.\\
Произведение матрицы на [[Единичная матрица|единичную матрицу]] подходящего порядка равно самой матрице:\\
;\\
.\\
Произведение матрицы на [[Нулевая матрица|нулевую матрицу]] подходящей размерности равно нулевой матрице:\\
;\\
.
Если и — [[Матрица (математика)#Квадратная матрица и смежные определения|квадратные матрицы]] одного и того же порядка, то произведение матриц обладает ещё рядом свойств.
Умножение матриц в целом некоммутативно:\\
.\\
Если , то матрицы и называются перестановочными или коммутирующими между собой.
[[Определитель]] и [[След матрицы|след]] произведения не зависят от порядка умножения матриц:\\
;\\
.\\
Если матрица не вырождена, то у неё есть обратная матрица. Такая что произведение исходной и обратной даёт единичную матрицу.\\
.
=====Алгоритмы перемножения матриц=====
Существует большое число алгоритмов умножения. И целый ряд быстрых алгоритмов основанных на группировки операций.
==== Алгоритм умножения матриц по определению ====
=== Код умножения прямоугольных матриц по определению ===
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;
**Входные параметры:**
* Прямоугольная матрица A.
* Прямоугольная матрица B.
**Выходные параметры:**
* Прямоугольная матрица R.
**Примечание:**\\
*Входные параметры не проверяются. Память под матрицу R должна быть выделена. Матрица R должна иметь число строк равные числу строк матрицы A. Матрица R должен иметь число столбцов числу столбцов матрицы A.
**Описание:**\\
*Умножение согласно определению.
==== Алгоритм умножения с транспонированием ====
Идея алгоритма в том, что-бы ускорить умножения предварительно транспонировать вторую матрицу. Тогда обращение к элементам второй матрицы будет линейно по памяти, что даёт прирост. См. [[Транспонирование_матрицы#блочный_алгоритм_транспонирования|быстрый(блочный) алгоритм транспонирования]].
Помимо ускорения за счёт более оптимального использования доступа к памяти. Возможно использовать аппаратное распараллеливание при помощи команд 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]] \\