首页 > 解决方案 > 从数组 A 复制不在数组 B 中的元素

问题描述

假设A是一个非重复整数的一维数组,并假设它B表示 的一个真子集A。是否有一个 Fortran 单线,可能使用掩码来选择A不在的元素BB我的意思是,我想要关于的集合论补集A

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

显然这可以通过显式循环来完成,但我试图避免这种情况。

标签: fortran

解决方案


是否有可能使用掩码的 Fortran 单行程序来选择 A 中不在 B 中的元素?

就在这里:

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

或等价物:

pack(a, .not.[(any(b == a(i)), i=1, size(a))])

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

  • 为了清楚起见:老实说,这条单线的意图非常明确。在这种情况下,可能不需要自定义函数/运算符,除非您多次执行此操作或想要隐藏不同的(更高效,但不是单行)实现。
  • 为了性能:a(i) == b为. 然后,它创建一个临时维度数组作为函数的掩码,并遍历它(归约)以构造具有最终大小的结果数组。如果值得的话(非常大的数组),您可以轻松地提出一种性能更高的算法。size(b)asize(a)pack

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


推荐阅读