AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Matrix multiplikation, help

Ein Thema von Jonas Shinaniganz · begonnen am 5. Jun 2012 · letzter Beitrag vom 7. Jun 2012
Antwort Antwort
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#1

Matrix multiplikation, help

  Alt 5. Jun 2012, 18:01
Mein Gehirn ist einfach zu klein um mein Projekt zum Abschluss zu bringen... bin ein bisschen deprimiert grade.

In meinem derzeitigen Programm soll der Benutzer 2 Matritzen eingeben, in Tabellen.
Die Tabellen sind in Spaltenanzahl und Zeilen Identisch und auch die Tabelle für sich hat immer genau so viele Spalten wie Zeilen.

Wenn der User die Eingaben erledigt hat wird jede Tabelle in ein 2D Array geschoben mit dem Ich dann weiter rechne.

Dann gibt es noch einen Ergebnis Array.

Also Ich habe folgendes Problem:

Array 1
10 3 5
3 3 5
8 7 9

Array 2
23 5 1
1 4 5
8 7 7

Ich brauche ne Schleife die jeden Wert aus meinen Array entsprechend der Gesetze der Matritzenmultiplikation berechnet. Wichtig: Ich möchte dass das ganez Skalier bar ist... d.h.
Es kann auch eine 1x1 oder 10x10 Matrix - Combo vorliegen und nicht nur dieses 3x3 Format.

Jetz muss man ja 10x23 + 3x1 + 8x8 ! 10x5 + 10x4 + 10x7 ! undsoweiter rechnet um dann zum Schluss:

Array Ergebnis
bla bla bla
bla bla bla
bla bla bla

Rauszubekommen... Ich hab mir das ganze versucht zu überlegen finde es aber derbe kompliziert grade...

Meine Schleife liefert nur einen Teil der Werte und sieht folgendermaßen aus:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender : TObject);
var
  I : Integer;
  I2: Integer;

  Ergebnis : Double;
  I3 : Integer;
begin
                       
  GridToArray(StringGrid1, MatrixData.ValueArray1);
  GridToArray(StringGrid2, MatrixData.ValueArray2);

  // einfach erstmal groß genug machen...
  SetLength(MatrixData.ResultArray, 20, 20);

  I := 0;
  while I <= High(MatrixData.ValueArray1) do
  begin
    I2 := 0;
    while I2 <= High(MatrixData.ValueArray1[I]) do
    begin

      Ergebnis := 0;
      for I3 := 0 to High(MatrixData.ValueArray2[I]) do
      begin
        Ergebnis := Ergebnis + (MatrixData.ValueArray1[I2, I3] * MatrixData.ValueArray2[I3, I2]);
      end;

      MatrixData.ResultArray[I, I2] := Ergebnis;
      inc(I2);
    end;
  inc(I);
  end;


end;
Würde mich auch freuen wenn jemand beschreiben könnte wie Ich mich solchen Problemen Gedanklich annähern kann, bin erst 22Jahre Alt also noch nicht alles verloren hoffe ich, gruß
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: Matrix multiplikation, help

  Alt 5. Jun 2012, 19:47
Ich würde das ganze in eine Funktion auslagern.
Dann für alles drei for Schleifen benutzen.
Zudem sind die Bezeichner i, i2, i3 ... unkonventionell. Normalerweise nimmt man i, j, k, ...
aber hier kann man auch row und col verwenden, dann ist das auch besser lesbar

Also mit den Änderungen:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender : TObject);
var
   I : Integer;
   I2: Integer;

   Ergebnis : Double;
   I3 : Integer;
begin
                        
   GridToArray(StringGrid1, MatrixData.ValueArray1);
   GridToArray(StringGrid2, MatrixData.ValueArray2);

   // TODO: Prüfen ob Multiplikation möglich
   
   // Größe berechnen
   Rows := Length(MatrixData.ValueArray1);
   Cols := Length(MatrixData.ValueArray2[0]);
   
   // einfach erstmal groß genug machen...
   // Nö, lieber direkt "richtig machen"
   SetLength(MatrixData.ResultArray, Rows, Cols);

   for row := 0 to Rows-1 do
   begin
    for col := 0 to Cols-1 do
     begin
       Ergebnis := 0;
       for i := 0 to High(MatrixData.ValueArray2) do // Grenze verändert
       begin
         Ergebnis := Ergebnis + (MatrixData.ValueArray1[col, i] * MatrixData.ValueArray2[i, col]); // Siehst du den Fehler?
       end;
       MatrixData.ResultArray[row, col] := Ergebnis;
     end;
   end;
end;
Der fehler sollte jetzt einfacher zu erkennen sein
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Matrix multiplikation, help

  Alt 5. Jun 2012, 20:47
Siehe Codeschnipsel von mir
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton ( 5. Jun 2012 um 20:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

AW: Matrix multiplikation, help

  Alt 6. Jun 2012, 21:47
Sofern nichts dagegen spricht, würde ich klassen draus machen. HAbe für meinen softwarerenderer Klassen für 4DMatritzen, 3d und 4D arrays. Entsprechende methoden inbegriffen.
Machts um einiges einfacher wenn man damit öfters hantieren muss.

MFG
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.506 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Matrix multiplikation, help

  Alt 7. Jun 2012, 06:07
Noch sinnvoller sind bei solchen Typen auch vor allem Records. Dann kann man die Operatoren auch direkt überladen und dann einfach direkt mit den entsprechenden Variablen rechnen. Das macht insbesondere komplexe Berechnungen sehr viel übersichtlicher.
Beispiel:
Delphi-Quellcode:
var
  Value1, Value2, MultResult: TMatrix;
begin
  Value1 := '((1, 2, 3), (4, 5, 4), (6, 1, 2))';
  Value2 := '(2, 3, 9)';
  MultResult := Value1 * Value2;
Mit:
Delphi-Quellcode:
  TMatrix = record
  private
    type
      TMatrixArray = array of array of Integer;
      PMatrixArray = ^TMatrixArray;
    var
      FWidth: Integer;
      FHeight: Integer;
      FData: TMatrixArray;
    function GetData: PMatrixArray;
  public
    constructor Create(const AWidth, AHeight: Integer);
    class operator implicit(const AValue: string): TMatrix;
    class operator implicit(const AValue: TMatrix): string;
    class operator Add(const AValue1, AValue2: TMatrix): TMatrix;
    class operator Multiply(const AValue1, AValue2: TMatrix): TMatrix;
    class operator Multiply(const AValue: TMatrix; const AScalar: Integer): TMatrix;
    property Data: PMatrixArray read GetData;
    property Width: Integer read FWidth;
    property Height: Integer read FHeight;
  end;

...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf