Как реализовать матричные операции в Pascal?
Вопрос
Мне нужно реализовать операции с матрицами, и размер матрицы должен быть переменным.Единственное решение, которое я придумал, - это использовать связанный список:
[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] ...
...
Но мне это кажется немного сложным..Есть ли лучшее (и более простое) решение?
Спасибо вам, ребята!
Решение
Одним из подходов было бы использование GetMem выделить ровно столько памяти, сколько нужно.GetMem, похоже, широко поддерживается.
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;
Другие советы
Любой современный вариант языка pascal (Delphi) позволит вам создавать динамические массивы (размером с среду выполнения).
Если язык не поддерживает многомерные динамические массивы, вы можете позаботиться об адресации самостоятельно:
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;
Такой вид адресации будет намного быстрее, чем следование по связанным спискам.
Не связан с StackOverflow