将WHERE中的蒙版应用于更高维度的数组

问题描述

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

PROGRAM test
REAL :: a(3,20,20),b(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

解决方法

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

b = MERGE(1,c>=0.5)

a可以用一种不太优雅但仍然紧凑的方式完成:

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

这两个命令都将为阵列中的所有元素提供一个关联。如果只需要过滤操作,则不管数组中的初始值如何,都可以将它们简化为WHERE构造:

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

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

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