我有一个整数数组(等级1),让我们说:
IDg = (/ 1 , 3, 5, 9 /)
该数组中的每个数字都是唯一的(不重复)。
我需要一些东西,让我们说另一个数组,告诉我在哪个位置可以找到条目。基本上我需要像
这样的东西 LinearPosition = (/ 1 0 2 0 3 0 0 0 5 /)
所以,如果我需要知道我会在哪个位置找到IDg = 5,我会输入
LinearPosition(5)
这将给我答案3.
当然有很多方法可以“给猫皮肤”,我当然可以构建像LinearPosition
这样的数组,但我认为它效率很低(特别是IDg
的值非常大。)
我不知道为什么,我有感觉指针可能会有所帮助,但我不太了解它们。
答案 0 :(得分:3)
此表达式
pack([(ix,ix=1,size(idg))],idg==5)
将返回包含索引的rank-1数组到idg
整数5
的位置。如果它是唯一的,那么返回的数组当然只有1个元素。
正如您所指出的,另一种方法是创建idg
的索引idg(index(i))==i
。
这些方法的优点,优雅,效率,等以及可能提出的其他方法取决于许多因素:稀疏性 vs 密度,更新率< em> vs 查询率,眼球,等。
如果您碰巧拥有Fortran 2008编译器,当然可以使用新的内部函数findloc
。
答案 1 :(得分:0)
实际上我想知道以下的解决方案是否会更有效(在内存要求方面):
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
这样,只需要存储IDg相同维度的数组,当然还有指针数组(可能不是“昂贵”)。 你觉得怎么样?