从 Fortran 数组中删除特定元素
Delete a specific element from a Fortran array
Fortran 中是否有删除数组中特定元素的函数,使得删除时数组的长度缩短删除元素的数量?
背景:
我目前正在从事一个项目,该项目包含一组人口以及对个人的相应描述(即年龄、死亡年龄等)。
我使用的一个方法是循环遍历数组,找到我需要的元素,放到另一个数组中,释放之前的数组,在下一个时间步之前,把这个数组移回数组再去通过子程序再次找到不需要的元素。
也许您想查看链表。您可以插入和删除项目,列表会自动调整大小。这个资源挺好的
http://www.iag.uni-stuttgart.de/IAG/institut/abteilungen/numerik/images/4/4c/Pointer_Introduction.pdf
您可以使用 PACK 内部函数和内部赋值来创建一个数组值,该值由另一个数组中的选定元素组成。假设 array
是可分配的,并且要删除的元素由逻辑掩码 logical_mask
指定,该掩码与 array
的原始值大小相同:
array = PACK(array, .NOT. logical_mask)
由其索引指定的单个元素的简洁语法是:
array = [array(:index-1), array(index+1:)]
根据您的 Fortran 处理器,上述语句可能会导致编译器创建可能影响性能的临时文件。如果这有问题,那么您将需要使用您描述的子例程方法。
要继续讨论,您可能想要实施的解决方案取决于您执行的删除操作和访问的次数,其中你 insert/delete 元素(第一个,最后一个,随机在集合中?),你如何访问数据(从第一个到最后一个,随机在集合中?),你的效率要求是什么CPU 和内存。
那么您可能想要使用链表或静态或动态向量(其他类型的数据结构也可能更适合您的需求)。
例如:
- 当您想随机访问大量元素并知道向量中元素的最大数量
nmax
时,可以使用静态向量。只需使用一个 nmax
元素数组和一个关联的 length
变量,该变量将跟踪最后一个元素。删除可以简单快速地完成,我将最后一个元素与删除的元素交换并减少长度。
- 当你不知道元素的最大数量时,可以实现一个动态向量。为了避免系统数组 allocation+copy+unallocation at for each deletion/insertion,你固定了元素的最大数量(如上所述)并且只增加它的大小(例如。
nmax
变为10*nmax
,然后在达到限制时重新分配和复制)(也可以实现反向系统以减少元素数量)。
Fortran 中是否有删除数组中特定元素的函数,使得删除时数组的长度缩短删除元素的数量?
背景: 我目前正在从事一个项目,该项目包含一组人口以及对个人的相应描述(即年龄、死亡年龄等)。
我使用的一个方法是循环遍历数组,找到我需要的元素,放到另一个数组中,释放之前的数组,在下一个时间步之前,把这个数组移回数组再去通过子程序再次找到不需要的元素。
也许您想查看链表。您可以插入和删除项目,列表会自动调整大小。这个资源挺好的 http://www.iag.uni-stuttgart.de/IAG/institut/abteilungen/numerik/images/4/4c/Pointer_Introduction.pdf
您可以使用 PACK 内部函数和内部赋值来创建一个数组值,该值由另一个数组中的选定元素组成。假设 array
是可分配的,并且要删除的元素由逻辑掩码 logical_mask
指定,该掩码与 array
的原始值大小相同:
array = PACK(array, .NOT. logical_mask)
由其索引指定的单个元素的简洁语法是:
array = [array(:index-1), array(index+1:)]
根据您的 Fortran 处理器,上述语句可能会导致编译器创建可能影响性能的临时文件。如果这有问题,那么您将需要使用您描述的子例程方法。
要继续讨论,您可能想要实施的解决方案取决于您执行的删除操作和访问的次数,其中你 insert/delete 元素(第一个,最后一个,随机在集合中?),你如何访问数据(从第一个到最后一个,随机在集合中?),你的效率要求是什么CPU 和内存。 那么您可能想要使用链表或静态或动态向量(其他类型的数据结构也可能更适合您的需求)。
例如:
- 当您想随机访问大量元素并知道向量中元素的最大数量
nmax
时,可以使用静态向量。只需使用一个nmax
元素数组和一个关联的length
变量,该变量将跟踪最后一个元素。删除可以简单快速地完成,我将最后一个元素与删除的元素交换并减少长度。 - 当你不知道元素的最大数量时,可以实现一个动态向量。为了避免系统数组 allocation+copy+unallocation at for each deletion/insertion,你固定了元素的最大数量(如上所述)并且只增加它的大小(例如。
nmax
变为10*nmax
,然后在达到限制时重新分配和复制)(也可以实现反向系统以减少元素数量)。