Wie Matrix-Operationen in Pascal implementieren?
Frage
Ich brauche Operationen mit Matrizen und Größe der Matrix zu implementieren ist variabel. Die einzige Lösung, die ich herauskommen, ist verkettete Liste zu verwenden:
[pointer to this row, pointer to another row] -> [element 1,1; link to another element] -> [element 1,2, link to another element] -> .... -> [nil]
|
v
[pointer to this row, pointer to another row] ...
...
Aber es scheint mir ein wenig komplex .. Gibt es eine bessere (und leichter) Lösung?
Danke Jungs!
Lösung
Ein Ansatz würde GetMem benutzen, genau genug Speicher zuzuweisen. GetMem scheint weitgehend unterstützt.
const
MAXMATRIXDATA: Word = 10000;
type
TMatrixDataType = Word;
TMatrixData = array[0..MAXMATRIXDATA] of TMatrixDataType;
PMatrixData = ^TMatrixData;
TMatrix = record
Rows, Cols: Word;
MatrixData: PMatrixData;
end;
PMatrix = ^TMatrix;
function CreateMatrix(Rows, Cols: Word): PMatrix;
var
Ret: PMatrix;
begin
New(Ret);
Ret^.Rows := Rows;
Ret^.Cols := Cols;
GetMem(Ret^.MatrixData,Rows*Cols*SizeOf(TMatrixDataType));
CreateMatrix := Ret;
end;
function GetMatrixData(Matrix: PMatrix; Row, Col: Word): TMatrixDataType;
begin
GetMatrixData := Matrix^.MatrixData^[(Row*Matrix^.Cols)+Col];
end;
procedure SetMatrixData(Matrix: PMatrix; Row, Col: Word; Val: TMatrixDataType);
begin
Matrix^.MatrixData^[(Row*Matrix^.Cols)+Col] := Val;
end;
Andere Tipps
Jeder moderner pascal Variante (Delphi) lassen Sie dynamische (Runtime-Größe) Arrays erstellen.
Wenn die Sprache nicht mehrdimensionale dynamische Arrays nicht unterstützt können Sie kümmern sich um die Adressierung selbst:
var
rows, cols, total, i, j : integer;
cell : datatype;
begin
rows := ...;
cols := ...;
total := rows * cols;
matrix := ...(total);
cell := matrix[i * cols + j]; // matrix[row=i,col=j]
end;
Diese Art der Adressierung wird viel schneller sein als verkettete Listen folgen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow