查找FORTRAN数组位置,4维数组

时间:2011-04-27 19:06:35

标签: arrays location fortran

嘿伙计们,我有一个问题。 如果在FORTRAN中给出一个四维数组,并告诉它找到它的某个部分的位置(起始位置为200,每个整数4个字节)。如果存储在行主要和列主要顺序中,是否存在找到位置的公式。

基本上给出了数组A(x:X,y:Y,z:Z,q:q)并告诉他找到A(a,b,c,d)的位置找到位置的公式是什么

3 个答案:

答案 0 :(得分:2)

在使用Fortran的C库时会出现这种情况 - 例如,调用MPI例程尝试发送Fortran数组的特定子集。

Fortran row-major,或更有用,第一个索引移动最快。也就是说,在存储器中以线性顺序的A(1,2,3,4)之后的项是A(2,2,3,4)。所以在上面的例子中,a增加一个是数组中1个索引的跳转; b中的跳跃对应于(X-x + 1)的跳跃; c中的跳跃对应于(X-x + 1)x(Y-y + 1)的跳跃,d中的跳跃是(X-x + 1)x(Y-y)的跳跃1)×(Z-Z + 1)。在基于C语言中,它恰恰相反;在d索引中跳1将在内存中移动1个索引; c中的跳跃将是(Q-q + 1)等的跳跃。

如果你有m个指标,并且n i 是左边的i th 索引中的(从零开始)索引,并且该索引的范围是N i ,那么起始位置的(从零开始)索引是这样的:

enter image description here

如果上限指数小于下限指数,则产品为1。要从数组的开头找到字节数,你需要将它乘以对象的大小,例如32位整数的4个字节。

答案 1 :(得分:1)

Fortran具有数组的列主要顺序。这在http://en.wikipedia.org/wiki/Row-major_order#Column-major_order描述。在那篇文章的下面,有一个更高维数组的内存偏移量的公式。

答案 2 :(得分:1)

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

我相信FORTRAN与许多其他语言不同,它将数组放入其中 专栏主要订单。这意味着最左边的索引是 处理多个时最频繁更改的一个 线性顺序的维数组。一旦 达到最左侧索引的最大尺寸,将其设置回1,假设为1 索引,并将下一级索引递增1并重新开始该过程。

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

示例:

假设您的数组的尺寸为2乘3乘4乘5.这意味着a 基质中总共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个单元格改变一次。一进入2零 赋予incex值为1的时间。对于最后一个(最左边的索引),只需将1加1即可 遗留下来,1 + 1 = 2.这给出了以下参考X(2,1,1,2)。

通过回溯到偏移量来仔细检查:

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

只需更改数字,并对任意数量的维度使用相同的流程 和/或抵消。