1

我有一个整数数组(排名 1)让我们说:

 IDg = (/ 1 , 3, 5, 9 /)

该数组中的每个数字都是唯一的(不重复)。

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

 LinearPosition = (/ 1  0  2  0  3  0  0  0  5 /)

所以如果我需要知道在哪个位置我会找到 IDg = 5 我会输入

LinearPosition(5) 

这会给我答案3。

当然“给猫剥皮”的方法有很多,我当然可以真正构建一个类似 的数组LinearPosition,但我认为它会非常低效(特别是如果 的值IDg非常大)。

我不知道为什么,我觉得指针可能会有所帮助,但我不太了解它们。

4

2 回答 2

3

这个表达

pack([(ix,ix=1,size(idg))],idg==5)

将返回一个 rank-1 数组,其中包含idg整数位置的索引5。如果它是唯一的,那么返回的数组当然只有 1 个元素。

正如您所指出的,另一种方法是为idgwhere创建一个索引idg(index(i))==i

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

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

于 2013-05-24T08:19:03.157 回答
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 相同维度的数组。你怎么看待这件事?

于 2013-05-27T00:43:22.297 回答