【问题标题】:How to interpret n-dimensional arrays in Fortran?如何解释 Fortran 中的 n 维数组?
【发布时间】:2021-12-28 19:10:31
【问题描述】:

我在 Fortran 中使用以下代码来删除高维数组:

real(8) X(48,20,7,3), Y(48,15,5)

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

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

【问题讨论】:

  • 你可以给下标赋予你想要的任何含义,对你的应用程序有意义的任何东西。 4D 阵列可以是图像,其索引表示例如 x、y 和 z 坐标以及通道号。在 MATLAB 中,您可以编写 X = zeros(48,20,7,3)
  • 请注意real(8) 中的幻数 8 不可移植,请参阅stackoverflow.com/questions/838310/fortran-90-kind-parameter

标签: matlab multidimensional-array fortran location


【解决方案1】:

数组是数组元素的集合(例如,realinteger 之类的数字或其他类型),它们以定义的顺序存储,默认情况下连续存储在内存中。

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

对于多维数组,您将它们存储在 Fortran 中的所谓 column-major order 中。它与 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]

矩阵看起来像

1 3
2 4
7 8

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

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

a = reshape([1, 2, 7, 3, 4, 8], [3,2])

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

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


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2011-04-12
    相关资源
    最近更新 更多