Matrixmultiplikation: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Änderung 23256 von Andreas (Diskussion) wurde rückgängig gemacht.)
Zeile 26: Zeile 26:
 
   sMatrix := Res;
 
   sMatrix := Res;
 
end;  
 
end;  
 +
</source>
 +
 +
== Matrix Multiplikation mit Operator ==
 +
Noch einfacher geht die Matrix Multiplikation, wen man es mit dem Operator "*" machen kann.<br>
 +
Diese Beispiel zeigt dies anhand der der OpenGL üblichen 4x4-Matrix.
 +
 +
<source lang="pascal">
 +
type
 +
  TVector4f = array[0..3] of GLfloat;
 +
  Tmat4x4  = array[0..3] of TVector4f;
 +
 +
 +
operator * (const m1, m2: Tmat4x4) Res: Tmat4x4;
 +
var
 +
  i, j, k: integer;
 +
begin
 +
  for i := 0 to 3 do begin
 +
    for j := 0 to 3 do begin
 +
      Res[i, j] := 0;
 +
      for k := 0 to 3 do begin
 +
        Res[i, j] := Res[i, j] + m2[i, k] * m1[k, j];
 +
      end;
 +
    end;
 +
  end;
 +
end;
 +
</source>
 +
=== Beispiel ===
 +
 +
<source lang="pascal">
 +
var
 +
  m, m0, m1: Tmat4x4;
 +
 +
begin
 +
  m := m0 * m1; // Sieht sehr einfach aus.
 
</source>
 
</source>

Version vom 18. Mai 2018, 20:29 Uhr

Zur Theorie der Matrixmultiplikation siehe den Matrix Artikel.

Emre lieferte im Forum diesen kleinen Codeschnipsel für die Matrixmultiplikation ab:

Type
  TSMatrix = Array of Array of Single;

//sMatrix := sMatrix * Matrix
procedure pSMatrixMatrixProduct( var sMatrix: TSMatrix; const Matrix: TSMatrix );
var
  m, n,
  o : Integer;
  Res  : TSMatrix;
begin
  {Matrices can only be multiplicated, if the row count of the matrix#1 is the same
  as the column of the second matrix:}
  if High(sMatrix[0]) <> High(Matrix) then
    Exit;
  {if a k*l matrix is multiplicated by a m*n matrix,
   the result matrix will have a k*n dimension:}
  SetLength( Res, Length(sMatrix), Length(Matrix[0]) );
  for m := 0 to High(Res) do
    for n := 0 to High(Res[m]) do
      for o := 0 to High(Matrix) do
        incS( Res[m,n], sMatrix[m,o]*Matrix[o,n] );
  sMatrix := Res;
end;

Matrix Multiplikation mit Operator

Noch einfacher geht die Matrix Multiplikation, wen man es mit dem Operator "*" machen kann.
Diese Beispiel zeigt dies anhand der der OpenGL üblichen 4x4-Matrix.

type
  TVector4f = array[0..3] of GLfloat;
  Tmat4x4   = array[0..3] of TVector4f;


operator * (const m1, m2: Tmat4x4) Res: Tmat4x4;
var
  i, j, k: integer;
begin
  for i := 0 to 3 do begin
    for j := 0 to 3 do begin
      Res[i, j] := 0;
      for k := 0 to 3 do begin
        Res[i, j] := Res[i, j] + m2[i, k] * m1[k, j];
      end;
    end;
  end;
end;

Beispiel

var
  m, m0, m1: Tmat4x4;

begin
  m := m0 * m1; // Sieht sehr einfach aus.