假设A
是一个非重复整数的一维数组,并且假设B
代表A
的适当子集。是否有一个Fortran单一代码行,也许使用掩码来选择A
中不存在的B
元素?我的意思是,我想要B
与A
的集合理论的补充。
例如,给定A = [ 0, 1, 2, 3, 4, 5 ]
和B = [ 1, 2, 4 ]
,给我C = [ 0, 3, 5 ]
。
很明显,这可以通过显式循环来完成,但我正在努力避免这种情况。
答案 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函数的第三个参数传递。