从Fortran数组中删除特定元素

时间:2016-04-11 23:27:01

标签: arrays fortran elements

Fortran中是否有一个删除数组中特定元素的函数,这样删除时的数组会缩短删除的元素数量?

背景: 我目前正在开展一个项目,其中包含一组人口,并对个人进行相应的描述(即年龄,死亡年龄等)。

我使用的方法是遍历数组,找到我需要的元素,将它放在另一个数组中,然后释放前一个数组,在下一个时间步之前,将该数组移回数组,然后再通过子程序再次找到不需要的元素。

3 个答案:

答案 0 :(得分:6)

您可以使用PACK内部函数和内部赋值来创建一个数组值,该值由另一个数组中的选定元素组成。假设array是可分配的,并且要删除的元素由逻辑掩码logical_mask提名,其大小与array的原始值相同:

array = PACK(array, .NOT. logical_mask)

由其索引提名的单个元素的简洁语法是:

array = [array(:index-1), array(index+1:)]

根据您的Fortran处理器,上述语句可能会导致编译器创建可能影响性能的临时值。如果这有问题,那么您将需要使用您描述的子程序方法。

答案 1 :(得分:1)

也许您想查看链接列表。您可以插入和删除项目,列表会自动调整大小。这个资源非常好。 http://www.iag.uni-stuttgart.de/IAG/institut/abteilungen/numerik/images/4/4c/Pointer_Introduction.pdf

答案 2 :(得分:0)

要继续讨论,您可能要实施的解决方案取决于您执行的删除操作访问的数量,您插入/删除元素的位置(首先,最后,在集合中随机?),你如何访问数据(从第一个到最后一个,在集合中随机?),你的CPU和内存的效率要求是什么。 然后你可能想要链表或静态或动态向量(其他类型的数据结构也可能更适合你的需要)。

例如:

  1. 当您想要随机访问大量元素并知道向量中元素的最大数量nmax时,可以使用静态向量。只需使用nmax元素数组以及将跟踪最后一个元素的关联length变量。删除可以简单快速地完成,我将最后一个元素与删除的元素进行交换并减少长度。
  2. 当您不知道元素的最大数量时,可以实现动态向量。为了避免每次删除/插入时系统数组分配+复制+取消分配,您可以修复最大元素数(如上所述)并仅增加其大小(例如nmax成为达到极限时10*nmax,然后重新分配和复制)(反向系统也可以实现以减少元素数量。)