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

Fortran 从数组A复制不在数组B中的元素,fortran,Fortran,假设A是非重复整数的一维数组,并假设B表示A的适当子集。是否有Fortran one liner(可能使用掩码)来选择a中不在B中的元素?我的意思是,我想要关于A的B的理论补码集 例如,给定A=[0,1,2,3,4,5]和B=[1,2,4],给我C=[0,3,5] 显然,这可以通过显式循环实现,但我试图避免这种情况 是否有一个Fortran one命令行程序(可能使用掩码)来选择a中不在B中的元素 是的,有: pack(a, [(all(b /= a(i)), i=1, size(a))])

假设
A
是非重复整数的一维数组,并假设
B
表示
A
的适当子集。是否有Fortran one liner(可能使用掩码)来选择
a
中不在
B
中的元素?我的意思是,我想要关于
A
B
的理论补码集

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

显然,这可以通过显式循环实现,但我试图避免这种情况

是否有一个Fortran one命令行程序(可能使用掩码)来选择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
    a
    中的每个元素创建一个大小为
    的临时掩码数组(b)
    ,并对其执行1次列表遍历(reduition)。然后,它创建一个
    size(a)
    维度的临时数组,作为
    pack
    函数的掩码,并遍历它(reduce)以构造结果数组,最终大小为。如果值得的话,您可以很容易地提出一种性能更高的算法(非常大的阵列)

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

的容器数组。您能解释一下为什么需要一个班轮吗?如果是为了清晰,这意味着我们不能做某些事情,如果是为了性能,这可能是一个错误的前提。这是为了清晰。我希望它尽可能多地记住数学集合生成器语法。B。现在剩下的就是由某人编写函数并定义运算符形式。我怀疑是否有人会拿出一行现成的Fortran,它更清晰。这是一个很好的例子,说明了像Fortran这样的语言支持用户定义函数的目的——将代码封装到漂亮的小程序包中,以使其清晰、易于重用。谢谢!我试试这个。由于
A
没有任何重复的元素,并且它包含
B
,因此结果的大小是已知的,它是
size(A)-size(B)
。我正在寻找一个在初始化表达式中也使用它们的行程序。我想性能在这里不是问题,因为涉及的数组总是非常小(比如10个元素)。