从数组A中复制不在数组B中的元素

时间:2018-10-15 15:02:57

标签: fortran

假设A是一个非重复整数的一维数组,并且假设B代表A的适当子集。是否有一个Fortran单一代码行,也许使用掩码来选择A中不存在的B元素?我的意思是,我想要BA的集合理论的补充。

例如,给定A = [ 0, 1, 2, 3, 4, 5 ]B = [ 1, 2, 4 ],给我C = [ 0, 3, 5 ]

很明显,这可以通过显式循环来完成,但我正在努力避免这种情况。

1 个答案:

答案 0 :(得分:3)

  

是否有一个Fortran单层衬板(也许使用蒙版)来选择不在B中的A元素?

是的,有:

break

或等效的内容:

pack(a, [(all(b /= a(i)), i=1, size(a))])

但是,请记住来自@francescalus和@HighPerformanceMark的评论,关于为什么要单线?

  • 为清楚起见:老实说,这一行很清楚。在这种情况下,自定义函数/运算符可能不是必需的,除非您要进行多次操作或希望隐藏其他(更有效,但不是一行)的实现。
  • 为了提高性能:pack(a, .not.[(any(b == a(i)), i=1, size(a))]) a(i) == b中的每个元素创建一个size(b)的临时掩码数组,并对其执行1个列表遍历(重复)。然后,它创建一个a维的临时数组作为size(a)函数的掩码,并遍历(缩小)以构造具有最终大小的结果数组。如果值得的话(非常大的数组),您可以轻松地提出一种性能更高的算法。

提示:如果您事先不知道结果数组的大小,则可能需要一个可分配的数组来存储结果(Fortran 2003的自动数组分配功能会在这里方便)。另一个选择是将大小为最小pack的容器数组作为pack函数的第三个参数传递。