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

标签 fortran where-clause

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

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

关于fortran - 将 WHERE 中的掩码应用于更高维度的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63619024/

相关文章:

fortran - 获取正在使用的 MPI Communicator 的数量

fortran - 在 Fortran 90 中,是否不可能在新变量的声明语句中引用先前声明的变量?

tsql - 你写哪个SQL?

sql - 具有嵌套多个条件的 WHERE 子句

fortran - 具有备用条目的函数的返回值

Fortran 隐含 do 不起作用

c# - Linq to sql,在动态where子句中使用like

MYSQL(WHERE - IF - SELECT/IN 语句)

where-clause - 无法在 CLASS 中使用带有 WHERE 子句的无符号变量?

fortran - 如何避免整数除法警告?