将WHERE中的掩码应用于更高维度的数组



我想将WHERE构造的结果应用于其他维度更高的数组,以便在下面的&quot-"标记WHERE中的索引。我想知道FINDLOC是否有帮助,但它似乎不能使用逻辑表达式。是否存在某种我不知道的ARGHERE内在函数来返回索引并应用它们?

PROGRAM test
REAL :: a(3,20,20),b(20,20),c(20,20)
CALL random_number(c)
a=1
b=1
WHERE (c<0.5) 
c=0
b=0 ! this is fine
a(:,-,-)=0 ! how to do this???
ENDWHERE
END PROGRAM test

对于与c大小相同的b数组,也许使用MERGE会更优雅:

b = MERGE(1,0,c>=0.5)

a也可以这样做,以一种不那么优雅但仍然紧凑的方式:

FORALL(i=1:20,j=1:20) a(:,i,j) = merge(1,0,c(i,j)>=0.5)

这两个命令都将为数组中的所有元素提供赋值。如果您只想要过滤操作,而不考虑数组中的初始值,那么也许可以将它们简化为WHERE构造:

FORALL(i=1:20,j=1:20,c(i,j)<0.5) a(:,i,j) = 0.0
WHERE (c<0.5) 
b=0.0
c=0.0
END WHERE

***编辑***根据@HighPerformanceMark的建议,后一个例子可以打包为

FORALL (i=1:20,j=1:20,c(i,j)<0.5)
a(:,i,j) = 0.0
b  (i,j) = 0.0
c  (i,j) = 0.0
END FORALL

最新更新