【问题标题】:Finding FORTRAN array location, 4-dimensional array查找 FORTRAN 数组位置,4 维数组
【发布时间】:2011-04-28 07:57:00
【问题描述】:

大家好,我有一个问题。 如果在 FORTRAN 中给定一个四维数组,并被告知找到其中某个部分的位置(起始位置为 200,每个整数 4 个字节)。如果以行优先和列优先顺序存储,是否有公式来查找位置。

基本上给定数组 A(x:X, y:Y, z:Z, q:q) 并告诉在 A(a,b,c,d) 处查找位置 查找公式是什么地点

【问题讨论】:

  • 什么构成位置?内存地址?与相邻元素的关系?从一开始的偏移量?

标签: arrays location fortran


【解决方案1】:

在将 C 库与 Fortran 一起使用时经常出现这种情况——例如,调用 MPI 例程试图发送 Fortran 数组的特定子集。

Fortran 是 row-major,或者更有用的是,第一个索引移动最快。即A(1,2,3,4)之后的项在内存中的线性顺序是A(2,2,3,4)。因此,在上面的示例中, a 增加 1 是数组中 1 个索引的跳跃; b中跳1对应于(X-x+1)的跳; c中跳1对应于(X-x+1)x(Y-y+1)的跳,d中跳1对应于(X-x+1)x(Y-y)的跳+1)x(Z-z+1)。在基于 C 的语言中,情况正好相反。 d 索引中的 1 跳跃将使您在内存中移动 1 个索引; c 中的跳跃将是 (Q-q+1) 的跳跃,等等。

如果您有 m 个索引,并且 ni 是左侧第 ith 索引中的(从零开始的)索引,并且该索引的范围为Ni,那么从起始位置开始的(从零开始的)索引是这样的:

如果上索引小于下索引,则乘积为 1。要查找数组开头的字节数,您可以将其乘以对象的大小,例如 32 位整数需要 4 个字节。

【讨论】:

  • 实际上,按照这些术语的通常定义,Fortran 是列优先和 C 行优先。
  • 确认,我的 LaTeX 中也有一个错字。我想是时候放下键盘了。
  • 这正是我要找的,找不到那个公式。非常感谢,感谢其他人的回复
【解决方案2】:

自从我做任何 FORTRAN 以来已经超过 25 年了。

我相信 FORTRAN 与许多其他语言不同,它以 列主要顺序。这意味着最左边的索引是 在处理多时变化最频繁的一种 线性顺序的维数组。一次 达到最左边索引的最大维度,将其设置回1,假设基于1 索引,并将下一级索引增加 1 并重新开始该过程。

计算任何给定地址偏移的索引配置 您需要知道 4 个数组维度中每个维度的值。没有这个 你做不到。

示例:

假设您的数组的尺寸为 2 x 3 x 4 x 5。这意味着 矩阵中总共有 2 * 3 * 4 * 5 = 120 个单元格。你想要对应的索引 到第 200 个字节。 这将是 (200 / 4) - 1 = 第 49 个单元格(假设每个单元格 4 个字节并且偏移量为零 是第一个单元格)。

首先观察特定索引如何转化为偏移量...

元素 X(1,1,1,1) 出现在哪个单元格编号上?简单回答:1 元素 X(1, 2, 1, 1) 出现在哪个单元格编号?自从我们骑车经过 最左边的维度必须是那个维度加 1。换句话说, 2 + 1 = 3. X(1, 1, 2, 1) 怎么样?我们通过前两个维度循环 这是 2 * 3 = 6 加 1 得到 7。最后 X(1, 1, 1, 2) 必须是: 2 * 3 * 4 = 24 加 1 得到第 25 个单元格。

注意下一个最右边的索引直到单元格编号才会增加 超过其左侧指数的乘积。使用这个观察你可以 通过从最右边开始计算任何给定单元格编号的索引 最左边的索引如下:

最右边的索引每 (2 * 3 * 4 = 24) 个单元格递增。 24 进入 49(单元格编号 我们想找到索引)两次 剩下1个。添加 1(对于基于 1 的索引),它给了我们一个最右边的 索引值为 2 + 1 = 3。下一个索引(向左移动)每 (2 * 3 = 12) 个单元格更改一次。一进12 零次,这给了我们索引 0 + 1 = 1。下一个索引每 2 个单元格更改一次。一进二零 次给出 1 的 incex 值。对于最后一个(最左边的索引),只需将 1 添加到任何值 剩下的,1 + 1 = 2。这给了我们以下参考 X(2, 1, 1, 2)。

通过将其返回到偏移量进行双重检查:

((2 - 1) + ((1 - 1) * 2) + ((1 - 1) * 2 * 3) + ((3 - 1) * 2 * 3 * 4) = 49。

只需更改数字并对任意数量的维度使用相同的过程 和/或偏移量。

【讨论】:

    【解决方案3】:

    Fortran 对数组有列优先顺序。这在http://en.wikipedia.org/wiki/Row-major_order#Column-major_order 中有描述。在那篇文章的后面,有一个更高维数组的内存偏移等式。

    【讨论】:

      猜你喜欢
      • 2014-02-27
      • 2014-04-19
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多