1

以前我有用于矩阵数据集设计的静态数组

TMatrix = record
    row, column: word; {m columns ,n strings }
    Data: array[1..160, 1..160] of real

 var
 Mymatrix  : TMatrix;

 begin

 Mymatrix.row := 160; - maximum size for row us is 160 for 2 x 2 static design.
 Mymatrix.columns := 160; -  maximum size for column us is 160  for 2 x 2 static design.

使用当前的设计,我只能在 2 维矩阵设计中拥有 160 x 160。如果我输入更大的数组大小 [1..161, 1..161] ,编译器将警告 E2100 数据类型太大:超过 2 GB 错误。因此,如果我将代码转换为动态数组,我需要重新构建所有当前代码以读取从 0 开始的矩阵。Previoulsy ,对于静态数组,数组将从 1 开始。一些外部函数从 1 开始读取矩阵。

所以,现在我坚持使用当前的代码,我需要创建超过一千个 N x N 矩阵大小。使用我当前的静态数组设计,如果低于 160 x 160 一切都很好。因此,我需要获得任何解决方案而无需过多地更改我当前的静态数组设计。

谢谢。

4

1 回答 1

6

继续使用基于 1 的索引会更容易。你可以通过几种不同的方式做到这一点。例如:

type
  TMatrix = record
  private
    Data: array of array of Real;
    function GetRowCount: Integer;
    function GetColCount: Integer;
    function GetItem(Row, Col: Integer): Real;
    procedure SetItem(Row, Col: Integer; Value: Real);
  public      
    procedure SetSize(RowCount, ColCount: Integer);
    property RowCount: Integer read GetRowCount;
    property ColCount: Integer read GetColCount;
    property Items[Row, Col: Integer]: Real read GetItem write SetItem; default;
  end;

function TMatrix.GetRowCount: Integer;
begin
  Result := Length(Data)-1;
end;

function TMatrix.GetColCount: Integer;
begin
  if Assigned(Data) then
    Result := Length(Data[0])-1
  else
    Result := 0;
end;

procedure TMatrix.SetSize(RowCount, ColCount: Integer);
begin
  SetLength(Data, RowCount+1, ColCount+1);
end;

function TMatrix.GetItem(Row, Col: Integer): Real;
begin
  Assert(InRange(Row, 1, RowCount));
  Assert(InRange(Col, 1, ColCount));
  Result := Data[Row, Col];
end;

procedure TMatrix.SetItem(Row, Col: Integer; Value: Real);
begin
  Assert(InRange(Row, 1, RowCount));
  Assert(InRange(Col, 1, ColCount));
  Data[Row, Col] := Value;
end;

这里的技巧是,即使动态数组使用基于 0 的索引,您也只需忽略存储在 0 索引中的值。如果您要从使用基于 1 的索引的 Fortran 移植代码,这种方法通常是最有效的。

于 2012-10-21T18:51:46.287 回答