AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Matrixmultiplikation Problem

Ein Thema von z3ro · begonnen am 8. Sep 2011 · letzter Beitrag vom 8. Sep 2011
Antwort Antwort
z3ro

Registriert seit: 8. Sep 2011
2 Beiträge
 
#1

Matrixmultiplikation Problem

  Alt 8. Sep 2011, 14:32
Delphi-Version: 5
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.

Geändert von z3ro ( 9. Sep 2011 um 10:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

AW: Matrixmultiplikation Problem

  Alt 8. Sep 2011, 14:47
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;
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#3

AW: Matrixmultiplikation Problem

  Alt 8. Sep 2011, 14:48
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;
  Mit Zitat antworten Zitat
z3ro

Registriert seit: 8. Sep 2011
2 Beiträge
 
#4

AW: Matrixmultiplikation Problem

  Alt 8. Sep 2011, 15:21
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

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.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Matrixmultiplikation Problem

  Alt 8. Sep 2011, 15:44
Hast du fixedrows bzw. fixedcols des stringgrid auch auf null stehen?
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:54 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