如何指向Fortran数组项的位置/索引?

如何指向Fortran数组项的位置/索引?,fortran,Fortran,我有一个整数数组(秩1),比如说: IDg = (/ 1 , 3, 5, 9 /) 该数组中的每个数字都是唯一的(不重复) 我需要一些东西,比如说另一个数组,它告诉我在哪个位置可以找到条目。基本上我需要 LinearPosition = (/ 1 0 2 0 3 0 0 0 5 /) 因此,如果我需要知道在哪个位置我将找到IDg=5,我将键入 LinearPosition(5) 这将给我答案 当然,“剥猫皮”的方法有很多种,我当然可以构建一个像LinearPositi

我有一个整数数组(秩1),比如说:

 IDg = (/ 1 , 3, 5, 9 /)
该数组中的每个数字都是唯一的(不重复)

我需要一些东西,比如说另一个数组,它告诉我在哪个位置可以找到条目。基本上我需要

 LinearPosition = (/ 1  0  2  0  3  0  0  0  5 /)
因此,如果我需要知道在哪个位置我将找到IDg=5,我将键入

LinearPosition(5) 
这将给我答案

当然,“剥猫皮”的方法有很多种,我当然可以构建一个像
LinearPosition
这样的数组,但我认为这会非常低效(特别是如果
IDg
的值非常大的话)

我不知道为什么,我感觉指针可能有用,但我不太了解它们。

这个表达式

pack([(ix,ix=1,size(idg))],idg==5)
将返回一个秩1数组,其中包含整数
5
位置的
idg
索引。当然,如果它是唯一的,那么返回的数组将只有1个元素

正如您所指出的,另一种方法是创建
idg
的索引,其中
idg(索引(i))==i

这些方法以及可能提出的其他方法的优点、优雅性、效率等取决于许多因素:稀疏性与密度、更新率与查询率、旁观者之眼等


如果您碰巧有Fortran 2008编译器,那么当然可以使用新的内在函数
findloc

实际上,我想知道下面这样的解决方案是否更有效(就内存需求而言):

这样,除了指针数组(可能并不“昂贵”)之外,只需存储IDg维度相同的数组。
你觉得怎么样?

相反,它让我想到了哈希映射或稀疏数组。如果IDg是排序的,你可以实现一个二进制搜索…谢谢你的输入,你实际上是对的。我对哈希映射一无所知,也从来没有想过稀疏数组的问题(我从来没有在Fortran中使用过它们,只是在Matlab中使用过)。谢谢你,马克。事实上,这正是我通常的做法(我在你的一篇文章中学会了这个技巧)。效率不是我所怀疑的。当效率是我衡量的一个问题时。
type :: punt_index
       integer(i4), pointer :: ptr
end type punt_index

type(punt_index), allocatable :: linear_position(:)

do i= 1,size(IDg)
     allocate(linear_position(IDg(i))%ptr)
     linear_position(IDg(i))%ptr = i  
end do