如何在 Fortran 中解释 n 维数组?

Ale*_*uiz 0 matlab location fortran multidimensional-array

我有以下行来删除 Fortran 中的高维数组:

real(8) X(48,20,7,3), Y(48,15,5)
Run Code Online (Sandbox Code Playgroud)

我的问题是我们如何解释 n 维数组?我想知道下标的含义。另外,如果可能的话,如果您能提供等效的代码来在 Matlab 中创建相同的 4D 和 3D 数组,我将不胜感激。

我曾尝试四处寻找这种解释,但只找到了一些例子,提到可以在不解释下标含义的情况下做到这一点。我非常感谢你的帮助。

Vla*_*r F 5

数组是数组元素(例如,像realinteger或某种其他类型的数字)的集合,它们以定义的顺序并且默认连续地存储在内存中。

这意味着对于一维数组,第二个元素位于第一个元素之后,然后是第三个元素......

对于多维数组,您可以按照所谓的列优先顺序将它们存储在 Fortran 中。它与 MATLAB 中使用的顺序相同。这意味着您按照具有相同最后索引的元素在内存中连续存储的顺序存储元素。

在 2D 中:A(2,3),顺序为:A(1,1)、A(2,1)、A(1,2)、A(2,2)、A(3,1)、A (3,2)


与 MATLAB 相比。让我们看一下这个数组

a = [1 3; 2 4; 7 8]
Run Code Online (Sandbox Code Playgroud)

矩阵看起来像

1 3
2 4
7 8
Run Code Online (Sandbox Code Playgroud)

在 Matlab 中,您可以在构造函数中使用行,尽管 MATLAB 使用连续列存储数组。这可能会令人困惑。

在 Fortran 中,这a(3,2)可以构造为

a = reshape([1, 2, 7, 3, 4, 8], [3,2])
Run Code Online (Sandbox Code Playgroud)

数字按以下顺序存储:两种语言中的 1、2、7、3、4、8。

在两种语言中,数组元素a(2,1)都等于 2。


3D 和 4D 数组自然地扩展了这一点,但对于答案中的简单示例来说不太方便。

如果您有一个 3D 数组,则内存中线性顺序中B(n1, n2, n3)元素的顺序为(假设第一个元素是元素号 1)。B(i1, i2, i3)(i3-1)*n2 + (i2-1)*n1 + i1