Как реализовать матричные операции в Pascal?

StackOverflow https://stackoverflow.com/questions/810821

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне нужно реализовать операции с матрицами, и размер матрицы должен быть переменным.Единственное решение, которое я придумал, - это использовать связанный список:

[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;

Такой вид адресации будет намного быстрее, чем следование по связанным спискам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top