Autor |
Beitrag |
Calculon
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mo 25.12.06 14:49
Hallo allerseits,
ich will eine Matrix, die in einer Textdatei gespeichert ist transponieren. Da ich zwei Felder (array of array of double) anfordern müsste (einmal für die zu transponierende und einmal für die transponierte Matrix), um das ganze über zweidimensionale Double-Felder zu realisieren, kam bei mir die Idee auf, das Transponieren auf String-Ebene zu machen.
Nur habe ich keine wirklich gute Idee für einen möglichst schnellen Algorithmus, der mir das erledigt.
Hat jemand irgendwelche Ideen?
Gruß
Calculon
--
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 25.12.06 14:55
Du kannst auf Strings wie auf ein Array von Chars zugreifen... Der erste Buchstabe hat aber den Index 1!
Ob das in einer TStringList sonderlich schnell ist, weiß ich nicht, aber es dauert bestimmt auch nicht so lange, dass es bei einer "normalen" Matrix ein Problem wäre.
// EDIT: Diese Methode habe ich mal bei Zahlen benutzt, die jeweils höchstens den Wert 255 annehmen konnten. Dann habe ich so die einzelnen Bytes gehabt. Aber das Einlesen in ein Array dürfte wohl schneller sein.
Zuletzt bearbeitet von jaenicke am Mo 25.12.06 15:02, insgesamt 2-mal bearbeitet
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mo 25.12.06 14:55
Bitte gib noch das Format der Textdatei an (am besten postest du ein Beispiel). Du kannst das ganze einfach in ein 2D-Array schreiben und beim Lesen einfach die Indeces vertauschen. Statt ein 2D-Array kannst du auch ein grosses 1D-Array verwenden.
Ob das Array jetzt of double oder of string ist, spielt eigentlich keine wesentliche Rolle (falls du Strings verwenden willst würde ich die Grösse begrenzen z.B. String[10]).
Oder du kannst das File als Ganzes in ein String laden und dann in einem Array of Integer jeweils den Startindex jedes Eintrages der Matrix speichern (vielleicht auch noch grad die Länge der Eintragsubstrings). Damit kannst du einiges an Rumkopieren von Daten sparen.
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mo 25.12.06 15:16
Zitat: | Du kannst auf Strings wie auf ein Array von Chars zugreifen... Der erste Buchstabe hat aber den Index 1!
Ob das in einer TStringList sonderlich schnell ist, weiß ich nicht, aber es dauert bestimmt auch nicht so lange, dass es bei einer "normalen" Matrix ein Problem wäre. |
Ja, so ähnlich hatte ich mir das auch gedacht. Aber ich dachte das geht bestimmt irgendwie besser.
Zitat: | Bitte gib noch das Format in der Textdatei an (am besten postest du ein Beispiel). |
Stinknormales ASCII-Format:
Zitat: | 3 3
60 30 20
30 20 15
20 15 12 |
Zitat: | Du kannst es einfach in ein 2D-Array schreiben und beim Lesen einfach die Indeces vertauschen. |
Auf die Idee bin ich gar nicht gekommen. Ich denke ich werde dann so 'ne procedure schreiben.
Kann ich einfach statt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure ReadMat(FileName: string; var A: TMatrix; var N, M: Integer); var F: Text; I, J: Integer;
begin Assign(F, FileName); Reset(F); Read(F, N, M);
DimMatrix(A, N, M); for I := 1 to N do for J := 1 to M do Read(F, A[I][J]);
Close(F); end; |
dies hier schreiben?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure ReadMat(FileName: string; var A: TMatrix; var N, M: Integer); var F: Text; I, J: Integer;
begin Assign(F, FileName); Reset(F); Read(F, N, M);
DimMatrix(A, M, N); for I := 1 to N do for J := 1 to M do Read(F, A[J][I]);
Close(F); end; |
Ich denke jetzt kommt bestimmt die Antwort: Probier's doch einfach aus!
Das werd' ich auch!
Danke für eure Hilfe!
Gruß
Calculon
--
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mo 25.12.06 15:18
Soll die transponierte Matrix wieder als File geschrieben werden oder was ist genau das Ziel?
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mo 25.12.06 15:24
Ja, genau das ist das Ziel. Wieder im selben Format:
Erste Zeile: Dimension der Matrix
ab zweiter Zeile: Transponierte Matrix
Also mit der Matrix wird nicht gerechnet.
|
|
|