AGB  ·  Datenschutz  ·  Impressum  







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

Matrizen-Multiplikation

Offene Frage von "krutho"
Ein Thema von krutho · begonnen am 13. Jun 2007 · letzter Beitrag vom 14. Jun 2007
Antwort Antwort
krutho

Registriert seit: 12. Jun 2007
9 Beiträge
 
#1

Matrizen-Multiplikation

  Alt 13. Jun 2007, 19:20
Hiho, ich bins wieder. Steck mal wieder total fest, da das Program nicht das tut, was es soll. Diesesmal geht es um Matrizenmultiplikation mit 3 Stringgrids und 2D-Arrays.
Bekomme wieder die Fehlermeldung, das " kein geeigneter Gleitkommawert ist.
Warscheinlich wieder irgendein Anfängerfehler. *Sich schon mal selbst die hand an den kopf hau*

Delphi-Quellcode:
procedure TForm3.Matrixmul(Sender:TObject);

var matrixA: array of array of double;
      matrixB: array of array of double;
      matrixC: array of array of double;
      a,b,c,i,j,k:integer;

begin


      a:=StrToInt(EditA.Text);
      b:=StrToInt(EditB.Text);
      c:=StrToInt(Editb.Text);
      SetLength(matrixA,a,b);
      SetLength(matrixB,b,c);
      SetLength(matrixc,a,c);
      For i:= 0 to a-1 do
        for j:= 0 to b-1 do
        begin
          matrixA[i,j]:=StrToFloat(SG1.Cells[i,j]);
        end;
      for i:= 0 to b-1 do
        for j:= 0 to c-1 do
        begin
          MatrixB[i,j]:=StrToFloat(SG2.Cells[i,j]);
        end;
        for i := 0 to a-1 do
          for j := 0 to c-1 do
            for k := 0 to b-1 do
              begin
                matrixc[i,j] := matrixc[i,j] + (matrixa[i,k] * matrixb[k,j]);
                SG3.Cells[i,j]:=FloatToStr(matrixc[i,j]);
              end;

end;
Schon mal danke im Voraus für eure Hilfe.
  Mit Zitat antworten Zitat
fLaSh11
(Gast)

n/a Beiträge
 
#2

Re: Matrizen-Multiplikation

  Alt 13. Jun 2007, 20:52
Wo tritt der Fehler genau auf?
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Matrizen-Multiplikation

  Alt 13. Jun 2007, 21:41
Die Meldung legt doch nahe, dass dein Fehler dann auftritt, wenn du versuchst einen leeren String in ein Float umzuwandeln. Der Fehler dürfte also im Einlesen der grids in die Arrays liegen. Sind denn alle Cells der Grids mit einer Zahl (z.B. 0) gefüllt?
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Matrizen-Multiplikation

  Alt 13. Jun 2007, 21:55
Ausserdem hätte wohl ein Thread auch gereicht, um ein und das gleiche Problem zu erklären: siehe hier
Fehlermeldungen darf man ruhig mal lesen und versuchen zu verstehen.
Zitat von Fehlermeldung:
" kein geeigneter Gleitkommawert
Da steht doch alles drin. Ein Leerstring kann nun mal nicht in ein Gleitkommawert umgewandelt werden.
  Mit Zitat antworten Zitat
krutho

Registriert seit: 12. Jun 2007
9 Beiträge
 
#5

Re: Matrizen-Multiplikation

  Alt 14. Jun 2007, 14:43
Der Fehler befindet sich nach meinen Kenntinisstand beim einlesen des zweiten Stringgrids,
also in etwa hier.

Delphi-Quellcode:
for i:= 0 to b-1 do
        for j:= 0 to c-1 do
        begin
          MatrixB[i,j]:=StrToFloat(SG2.Cells[i,j]);
        end;
Sorry das ich euer Forum überflute, aber ich weiß an der Stelle wirklich nicht weiter, da
ich nicht weiß, warum hier eine Zelle keine Gleitkommazahl enthalten sollte.
Es sind definitiv alle existierenden Stringgridcells mit Zahlen belegt (mach ich vorher mit random). Hab ich vielleicht ein Array falsch mit Indizes versehen ?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Matrizen-Multiplikation

  Alt 14. Jun 2007, 14:50
Hallo,

vielleicht kommst du deinem Fehler so auf die Spur:

Delphi-Quellcode:
// ...
      for i:= 0 to b-1 do
        for j:= 0 to c-1 do
          if (i < SG2.ColCount) and (h < SG2.RowCount)
            then MatrixB[i,j] := StrToFloat(SG2.Cells[i,j])
            else ShowMessage(Format('Index out of Bounds: SG2.Cells[%d,%d]', [i, j]));
Grüße vom marabu
  Mit Zitat antworten Zitat
krutho

Registriert seit: 12. Jun 2007
9 Beiträge
 
#7

Re: Matrizen-Multiplikation

  Alt 14. Jun 2007, 15:35
Danke für den Vorschlag, habs aber jetzt doch selbst hingekriegt (mehr oder weniger).
Hier erstmal meine Änderungen.
Delphi-Quellcode:
procedure TForm3.Matrixmul(Sender:TObject);

var matrixA: array of array of double;
      matrixB: array of array of double;
      matrixC: array of array of double;
      a,b,c,i,j,k:integer;

begin
      a:=StrToInt(EditA.Text);
      b:=StrToInt(EditB.Text);
      c:=StrToInt(Editb.Text);
      SetLength(matrixA,a,b);
      SetLength(matrixB,b,c);
      SetLength(matrixc,a,c);
        for i := 0 to a-1 do
            for j := 0 to c-1 do
            begin
              matrixc[i,j] := 0;
              SG3.Cells[j,i]:='0';
            end;
      For i:= 0 to SG1.RowCount-1 do
        for j:= 0 to SG1.ColCount-1 do
        begin
          matrixA[i,j]:=StrToFloat(SG1.Cells[j,i]);
        end;
      for i:= 0 to SG2.RowCount-1 do
        for j:= 0 to SG2.ColCount-1 do
        begin
          MatrixB[i,j]:=StrToFloat(SG2.Cells[j,i]);
        end;
        for i := 0 to SG1.RowCount-1 do
          for j := 0 to SG3.ColCount-1 do
            for k := 0 to SG2.RowCount-1 do
              begin
                matrixc[i,j] := matrixc[i,j] + (matrixa[i,k] * matrixb[k,j]);
                SG3.Cells[j,i]:=FloatToStr(matrixc[i,j]);
              end;

end;
In den meisten Fällen funzt das jetzt. Will ich nun jedoch z.B. eine 4x2
mit einer 2x4 Matrix multiplizieren, so erhalte ich eine neue Fehlermeldung.

"ungültige Zeigeroperation"

Was soll das denn bedeuten? Danke für eure Hilfe
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Matrizen-Multiplikation

  Alt 14. Jun 2007, 16:00
Du brauchst zwei Konvertierungsfunktionen:
StringGrid -> Matrize
Matrize -> Stringgrid
Hier die Deklarationen:
Delphi-Quellcode:
type
   T2DMatrix = array of array of double;
...
procedure StringgridToMatrix(const sg:TStringGrid; var matrix:T2DMatrix);
procedure MatrixToStringgrid(const matrix:T2DMatrix; sg:TStringGrid);
Wichtig: die Anzahl von Reihen und Spalten der Matrix muss zum StringGrid passen.
Das lässt sich aber per Code überprüfen.
Andreas
  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 04:53 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