如果您有一维数组,您可以简单地使用位于Math 单元中的Mean 函数。
但对于多维数组恐怕还没有可用的功能。主要原因是Delphi对多维数组的处理方式比较特殊。
而在许多其他编程语言中,多维数组实际上只是一维数组,具有用于访问数组元素的修改机制,其工作原理如下:
Actual Array Item Index = First parameter + (Second parameter * Size of first dimension)
在 Delphi 中,多维数组表示为由另一个数组引用的多个一维数组,如下所示:
Array of One Dimensional Array
编辑 2:正如 David 在他的评论中提到的,这些类型的数组也称为 Jagged arrays 或 Ragged arrays。
为什么会如此不同?为什么如此重要?因为那些来自 Delphi 中多维数组的一维数组不需要具有相同的大小。所以你的多维数组中的数据实际上可以是这样的(每个 X 代表一个数组项):
XXXX
XXXXXXX
XXXX
XXXXX
所以恐怕你必须为此编写自己的函数。但这不应该那么难。
您所需要的只是一种遍历数组中每个项目的机制(我敢打赌,您已经在代码中的某个地方实现了这一点),这样您就可以总结数组中所有元素的值。然后将该总和除以数组中元素的数量,以获得所有项目的算术平均值。
编辑 3:我不确定您是否可以使用单个代码来遍历所有动态数组。我的意思是至少你需要知道你的数组有多少维。这是必需的,因为要遍历数组的多个维度,您实际上需要递归遍历表示单独维度的每个单独数组。
对 3D 动态数组中的元素求和的代码如下所示:
type
TDyn3Darray = array of array of array of Single;
implementation
function SumOf3DArray(Dyn3DArray: TDyn3DArray): Single;
var X,Y,Z, a: Integer;
ArrItem: Single;
begin
Result := 0;
SetLength(Dyn3Darray,5,8,40);
for X := Low(Dyn3Darray) to High(Dyn3Darray) do
begin
for Y := Low(Dyn3Darray[X]) to High(Dyn3Darray[X]) do
begin
for Z := Low(Dyn3Darray[X,Y]) to High(Dyn3Darray[X,Y]) do
begin
Result := Result + Dyn3Darray[X,Y,Z];
end;
end;
end;
end;
我相信您将能够自己针对不同数量的维度修改代码。
编辑1:至于linearizing 的多维数组,我相信您的意思是更改一维数组中的多维数组,您只需复制不同维度的元素并将它们添加到一维数组中。
但是仅仅为了获得所有元素的平均值而这样做是不切实际的,因为首先你需要双倍的内存量,其次为了将所有元素从多个维度复制到一个维度中,你可能需要首先遍历每个元素。然后,无论您使用什么方法来计算平均值,都必须再次遍历所有这些复制的元素,从而无缘无故地减慢处理速度。
如果您有兴趣用一维数组替换多维数组,同时仍然威胁其元素,就好像它们在多维数组中一样,请查看我对其他一些编程语言如何处理多维数组的解释。
请注意,这将要求您通过特殊方法访问此类数组的所有项,因此会导致您与这些数组交互的代码发生较大更改。除非您将这些数组包装在具有默认多索引属性的类中,该属性将允许您访问数组项。这种方法需要额外的代码来初始化和完成此类类,并且在调整此类数组的大小时需要稍微修改方法。