首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找FORTRAN数组位置,4维数组

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

Stack Overflow用户
提问于 2011-04-28 03:06:35
回答 2查看 2.1K关注 0票数 0

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

基本给定数组A(x:X,y:Y,z:Z,q:q),并被告知在A(a,b,c,d)处寻找位置

EN

回答 2

Stack Overflow用户

发布于 2011-04-28 04:56:13

我已经超过25年没有做过任何FORTRAN了。

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

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

示例:

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

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

元素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)个单元格改变一次。1进入12个0次,得到索引0+1=1。下一个索引每2个单元格改变。对于最后一个(最左边的索引),只需在剩余的值上加1,1+1= 2。这给出了下面的引用X(2,1,1,2)。

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-28 04:55:39

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5809200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档