0

I am writing some matrix routines in Delphi and this problem came up. I have defined a real matrix thus:-

RealArrayNPbyNP = Array[1..200,1..200] of Extended;

I have populated this array with a 5 x 6 matrix.

How do I query the array to get the number of rows (which in this case will be 5) and the number of cols (which in this case will be 6) in delphi code.

4

4 回答 4

3

您将矩阵声明为 200 x 200。无论您使用多少矩阵,矩阵始终为 200 x 200。您 5 x 6 范围之外的所有字段都至少包含一些数据,无论它是否有用。

也许您应该考虑使用动态数组:

var
  arr: array of array of Extended

有了这个,您可以使用 Setlength 来满足您的需求。要获得 5x6 矩阵,您可以使用以下代码(感谢 Rob 的提示)

SetLength(arr, 5, 6);

可以看到,实际尺寸可以通过Length函数查询。Length(arr) 获得第一个维度,而 Length(arr[I) 将给出第二个维度。

使用这种结构,矩阵的每一“行”都可以有独立数量的“列”。

于 2010-02-06T12:17:19.930 回答
2

如果您不想要动态数组并且没有关于哪些值构成有效值的附加信息(即,如果您无法搜索/计算它们),那么您基本上必须有附加信息。换句话说,您需要另外两个变量,NRowsNColumns在填充数组时设置它们。

于 2010-02-06T13:43:31.927 回答
0

如果我正确理解了您的问题,那么您要做的是拥有一个预分配的数组,您只填充了部分数组,并且您想确定填充了多少。

我将创建一个包含处理此“数组”的所有逻辑的类,并为包含以下逻辑的数组编写一个属性设置器:

Procedure SetArrayValue(X,Y:Extended);
begin
  fInternalArray[x,y] := Extended;
  fInternalArrayMaxX := Max(fInternalArrayMaxX,X);
  fInternalArrayMaxY := Max(fInternalArrayMaxY,Y);
end;

和一个数组初始化/清除函数,如下所示:

Procedure ClearArray;
begin
  FillMemory(@fInternalArray,SizeOf(fInternalArray),0);
  fInternalArrayMaxX := 0;
  fInternalArrayMaxY := 0;
end;

您还可以通过添加另一个与布尔值边界匹配的数组并适当地修改它来扩展数组元素是否具有值的确定。

于 2010-02-08T17:23:08.613 回答
0

如果您可以保证矩阵最初填充了已知值,例如 0 或某个无效值,那么您可以执行相当于strlen()并简单地计算标志值之前存在的第一行和第一列中的元素数量。然而,这往往是低效的。为什么不能根据需要传递当前大小?或者更好的是,将矩阵功能封装在适当的对象中。

于 2010-02-06T12:14:54.523 回答