Autor Beitrag
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure ReadMat(FileName: stringvar A: TMatrix; var N, M: Integer);
var
  F: Text; { Data file }
  I, J: Integer; { Loop variable }

begin
  Assign(F, FileName);
  Reset(F);
  { Read matrix }
  Read(F, N, M);

  DimMatrix(A, N, M); // externe procedure

    for I := 1 to N do
      for J := 1 to M do
        Read(F, A[I][J]);

  Close(F);
end;


dies hier schreiben?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure ReadMat(FileName: stringvar A: TMatrix; var N, M: Integer);
var
  F: Text; { Data file }
  I, J: Integer; { Loop variable }

begin
  Assign(F, FileName);
  Reset(F);
  { Read matrix }
  Read(F, N, M);

  DimMatrix(A, M, N); // externe procedure

    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! :wink:
Das werd' ich auch!

Danke für eure Hilfe!

Gruß

Calculon
--
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 25.12.06 15:18 
Soll die transponierte Matrix wieder als File geschrieben werden oder was ist genau das Ziel?
Calculon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: 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.