Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem nach Matrizenmultiplikation (https://www.delphipraxis.net/150763-problem-nach-matrizenmultiplikation.html)

Mysterio08 26. Apr 2010 14:47


Problem nach Matrizenmultiplikation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag,

ich lasse eine/n Nutzer/in in ein StringGrid, dessen Row- und ColCount er/sie bestimmen kann, Zahlen eingeben, die dann in ein dynamisches, zweidimensionales Array of Double eingelesen und als Matrizen multipliziert werden.
Der Code dafür sieht wie folgt aus:
Delphi-Quellcode:
procedure TMatrizen.MatrizenMultiplikation;
var i, j, Zeile, Spalte: Byte;
    MatrixA, MatrixB, MatrixE: Array of Array of Double;
begin
  //Hier steht für mein Problem unwichtiger Code
  ...
  //MatrixA * MatrixB (den anderen Fall, BxA, habe ich absichtlich hier weggelassen, das Prinzip ist das gleiche)
  if SAA = ZAB then begin
    //This is the part where the matrices are multiplied
    //Do for all rows
    repeat
       //Do for all cols
      repeat
         //Specific part of the multiplication
        for i := 0 to SAA-1 do
        begin
          MatrixE[Spalte, Zeile] := MatrixE[Spalte, Zeile] + MatrixA[i,Zeile]*MatrixB[Spalte,i]
        end;
        Inc(Spalte)
        until Spalte = SAA;
      Inc(Zeile);
      Spalte := 0
    until Zeile = ZAA;
  //Hier folgt weiterer, nicht so wichtiger Code
end;
Multipliziere ich zwei quadratische Matrizen, gibt es keine Probleme, alle Elemente werden richtig errechnet und ausgegeben.
Lauten die Dimensionien aber 3 kreuz 2 * 3 kreuz 3, dann bekomme ich die im Anhang mitgeschickte Fehlermeldung, sobald ich ein Element ausgeben will - aber nur, wenn ich vorher nicht zwei quadratische Matrizen multipliziert habe, denn sonst funktioniert es.
Meine Vermutung ist, dass es mit der Multiplikation zusammenhängen muss, allerdings weiß ich nicht wo. Wenn weiterer Code erwünscht ist, kann ich den auch noch zeigen.

mfg. Mysterio08

jfheins 26. Apr 2010 14:55

Re: Problem nach Matrizenmultiplikation
 
Zitat:

Zitat von Mysterio08
Lauten die Dimensionien aber 3 kreuz 2 * 3 kreuz 3, dann bekomme ich die im Anhang mitgeschickte Fehlermeldung, sobald ich ein Element ausgeben will - aber nur, wenn ich vorher nicht zwei quadratische Matrizen multipliziert habe, denn sonst funktioniert es.
Meine Vermutung ist, dass es mit der Multiplikation zusammenhängen muss, allerdings weiß ich nicht wo. Wenn weiterer Code erwünscht ist, kann ich den auch noch zeigen.

Du weist schon, dass eine Multiplikation 3x2 mal 3x3 nicht definiert ist? Insofern würde ich den Fehler eher da sehen wo keine Fehlermeldung kommt ;)

Lösung des Problems: Fange den Fall vorher ab, und zeige eine Sinnvolle Fehlermeldung an. Besser noch: Werfe in der Matrizen-multiplikations-Funktion eine eigene Exception (z.B.: EInvalidDimensionException) sodass der Aufrufer wählen kann, was passieren soll.

Aphton 26. Apr 2010 15:35

Re: Problem nach Matrizenmultiplikation
 
Hier hab ich mal eine Routine für die Matrixmultiplikation geschrieben.
Dürfte eventuell hilfreich sein!

MfG

Mysterio08 26. Apr 2010 16:44

Re: Problem nach Matrizenmultiplikation
 
Zitat:

Zitat von jfheins
Du weist schon, dass eine Multiplikation 3x2 mal 3x3 nicht definiert ist? Insofern würde ich den Fehler eher da sehen wo keine Fehlermeldung kommt ;)

Ich habe mich verschrieben, ich meinte 2x3 mal 3x3.
Das mit der Exception ist auch hilfreich, nur sollte die ja nicht erscheinen, wenn gar kein Fehler vorliegt; damit beschäftige ich mich dann, wenn alles soweit läuft.

Deinen Artikel, Aphton, habe ich mir angeschaut, aber nicht implementiert, ich versuche meinen Lösungsweg zu Ende zu bringen.
Aber was genau meint denn die Fehlermeldung, die ich bei meinem ersten Eintrag mit angehangen habe? Solch eine habe ich noch nie erhalten, und ich kann sie nicht deuten.

Teekeks 26. Apr 2010 16:57

Re: Problem nach Matrizenmultiplikation
 
Diese Fehlermeldung bedeutet das du in Speicher rumschreibst/ließt der dir nicht gehört.

Mysterio08 26. Apr 2010 17:08

Re: Problem nach Matrizenmultiplikation
 
Zitat:

Zitat von Teekeks
Diese Fehlermeldung bedeutet das du in Speicher rumschreibst/ließt der dir nicht gehört.

Ja, jetzt, wo ich das Problem gelöst habe, leuchtet es mir ein. Das Problem war das ich die Matrizen falsch initialisiert habe: ich habe es so geschrieben
Delphi-Quellcode:
  //Fall Multiplikation AxB
  for i := 0 to SAA-1 do //Für alle Spalten der MatrixA
    for j := 0 to ZAB-1 do //Für alle Zeilen der MatrixB do
      //Code zur Initialisierung nur für MatrixA
      Val(StringGridA.Cells[i,j], MatrixA[i,j], Code)
Dabei muss MatrixA nicht immer so viel Zeilen wie MatrixB haben, das schließt ja der Fall MatrixA*MatrixB mit MatrixA=3kreuz2 und MatrixB=3kreuz3 aus.
Da lag das Problem, das ich jetzt behoben habe, die Berechnungen werden nun einwandfrei durchgeführt.
Wenn allerdings noch was sein sollte, schildere ich mein Problem erneut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz