Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Matrixmultiplikation Problem (https://www.delphipraxis.net/162882-matrixmultiplikation-problem.html)

z3ro 8. Sep 2011 14:32

Delphi-Version: 5

Matrixmultiplikation Problem
 
Hallo,

ich möchte ein Programm schreiben, welches mir zwei beliebig große Matrizen miteinander multipliziert. Dazu werden zunächst die Dimensionen der beiden Matrizen eingegeben und daraufhin zwei Arrays erstellt. Eine Multiplikation wird nur durchgeführt, wenn die Spaltenanzahl der ersten Matrix gleich der Zeilenanzahl der zweiten Matrix ist. Die Größe der Ergebnismatrix ist die Zeilenanzahl der Ersten -und die Spaltenanzahl der Zweiten.

So weit so gut ;) nun sollen die Werte berechnet werden. Btw: ausgegeben werden die Werte in ein StringGrid mittels IntToStr().

Hier der erste Teil des Codes. Beim Klick auf den Button werden die Werte für die Dimensionen ausgelesen und die Arrays erstellt. Daraufhin werden nach der Reihe vom Nutzer Werte eingegeben (ja ich weiss nicht sehr elegant xD aber es soll einfach nur funktionieren).

Die Matrizen sind M1Matrix, M2Matrix, welche multipliziert werden sollen und MEMatrix speichert das Ergebnis. Alle drei wurde vorher als Array of Array of Integer initialisiert.


Die Matrizen sind nun erstellt und beim Klick auf den Button für Multiplizieren wird folgender Code ausgeführt:

Das Problem ist nun, dass ich total astronomische Werte ausgegeben bekomme und dazu auch noch in Zeilen und Spalten (beim StrinGrid) absolut nicht stimmen. Ich hoffe ihr könnt mir weiterhelfen.

jfheins 8. Sep 2011 14:47

AW: Matrixmultiplikation Problem
 
Also einen Fehler habe ich schonmal gefunden.
Du solltest dich übrigens mit der setlength Funktion vertraut machen, die nimmt auch 3 Parameter an ;-)

Delphi-Quellcode:
procedure TForm1.MultiplizierenButtonClick(Sender: TObject);
var
  i: Integer;
  j: Integer;
  k: Integer;
  summe: Integer;
begin
 //Abfrage ob Spaltenanzahl der ersten Matrix gleich der Zeilenanzahl
 //zweiten Matrix ist

 if Length(M1Matrix[0]) = Length(M2Matrix) then
    begin
          //Setzen der Groesse der Ergebnismatrix
          SetLength(MEMatrix, Length(M1Matrix));
          for i := 0 to Length(MEMatrix) do
          begin
            SetLength(MEMatrix[i], Length(M2Matrix[i]));
          end;

          //Durchlaufen der Ergebnismatrix
          for i := 0 to Length(MEMatrix)-1 do
          begin
            for j := 0 to Length(MEMatrix[0])-1 do
              summe := 0; // <<<<<-----------------------------------------------------------fehler !!
            begin
              //Errechnen der Ergebniswerte aus den eingebenen Matritzen
              for k := 0 to Length(M1Matrix[i])-1 do
                begin
                      summe := summe + (M1Matrix[i,k] * M2Matrix[k,j]);
                end;
              MEMatrix[i,j] := summe;
              StringGrid3.Cells[j,i] := IntToStr(summe);
            end;
          end;
    end

 else

    begin
       ShowMessage('Spaltenanzahl der ersten Matrix ist ungleich der Zeilenanzahl der zweiten Matrix. Keine Multiplikation möglich.')
    end
end;

gammatester 8. Sep 2011 14:48

AW: Matrixmultiplikation Problem
 
Du muß selbstverständlich die Skalarproduktsumme immer wieder für jedes Element MEMatrix[i,j] neu-initialisieren, am besten setz mal die Summe direkt vor der k-Schleife auf Null:
Delphi-Quellcode:
for j := 0 to Length(MEMatrix[0])-1 do
begin
  //Errechnen der Ergebniswerte aus den eingebenen Matritzen
  summe := 0;
  for k := 0 to Length(M1Matrix[i])-1 do
    begin
          summe := summe + (M1Matrix[i,k] * M2Matrix[k,j]);
    end;
  MEMatrix[i,j] := summe;
  StringGrid3.Cells[j,i] := IntToStr(summe);
end;

z3ro 8. Sep 2011 15:21

AW: Matrixmultiplikation Problem
 
Zitat:

Zitat von jfheins (Beitrag 1122684)
Also einen Fehler habe ich schonmal gefunden.
Du solltest dich übrigens mit der setlength Funktion vertraut machen, die nimmt auch 3 Parameter an ;-)

hah, Delphianfänger ;) aber danke für den Hinweis! Wird mir sicher ein paar Zeilen in Zukunft ersparen ;)

Zitat:

Zitat von gammatester (Beitrag 1122685)
Du muß selbstverständlich die Skalarproduktsumme immer wieder für jedes Element MEMatrix[i,j] neu-initialisieren, am besten setz mal die Summe direkt vor der k-Schleife auf Null:
Delphi-Quellcode:
for j := 0 to Length(MEMatrix[0])-1 do
begin
  //Errechnen der Ergebniswerte aus den eingebenen Matritzen
  summe := 0;
  for k := 0 to Length(M1Matrix[i])-1 do
    begin
          summe := summe + (M1Matrix[i,k] * M2Matrix[k,j]);
    end;
  MEMatrix[i,j] := summe;
  StringGrid3.Cells[j,i] := IntToStr(summe);
end;

Danke! Daran lag es, ärgere mich gerade selber über sowas banales ;) alles funktioniert jetzt perfekt! :) Den einzigen "Bug" den ich jetzt noch habe ist, dass in dem StringGrid an der Position 1,1 zwar eine Zahl steht, diese allerdings erst sichtbar ist wenn ich drauf klicke?! Oo sehr seltsam.. alle anderen sind sichtbar.

Bjoerk 8. Sep 2011 15:44

AW: Matrixmultiplikation Problem
 
Hast du fixedrows bzw. fixedcols des stringgrid auch auf null stehen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 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