Fortran中是否有一个删除数组中特定元素的函数,这样删除时的数组会缩短删除的元素数量?
背景: 我目前正在开展一个项目,其中包含一组人口,并对个人进行相应的描述(即年龄,死亡年龄等)。
我使用的方法是遍历数组,找到我需要的元素,将它放在另一个数组中,然后释放前一个数组,在下一个时间步之前,将该数组移回数组,然后再通过子程序再次找到不需要的元素。
答案 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和内存的效率要求是什么。 然后你可能想要链表或静态或动态向量(其他类型的数据结构也可能更适合你的需要)。
例如:
nmax
时,可以使用静态向量。只需使用nmax
元素数组以及将跟踪最后一个元素的关联length
变量。删除可以简单快速地完成,我将最后一个元素与删除的元素进行交换并减少长度。nmax
成为达到极限时10*nmax
,然后重新分配和复制)(反向系统也可以实现以减少元素数量。)