掩盖Fortran阵列的更好方法是什么?

use*_*241 3 arrays fortran masking fortran90

我想掩盖一个Fortran数组.这是我目前正在做的方式......

where (my_array <=15.0)
    mask_array = 1
elsewhere
    mask_array = 0
end where
Run Code Online (Sandbox Code Playgroud)

那么我得到我的蒙面数组:

masked = my_array * mask_array
Run Code Online (Sandbox Code Playgroud)

有没有更简洁的方法来做到这一点?

For*_*ner 7

使用MERGE内在函数:

masked = my_array * merge(1,0,my_array<=15.0)
Run Code Online (Sandbox Code Playgroud)

  • 在同一主题`masked = MERGE(my_array,0._blah,my_array <= 15)`. (4认同)

Hig*_*ark 7

或者,坚持where

masked = 0
where (my_array <=15.0) masked = my_array
Run Code Online (Sandbox Code Playgroud)

我希望使用where和使用之间在速度和内存消耗方面存在差异,merge但我不知道它们是什么。


fra*_*lus 5

这里已经给出了两种不同的方法:一种是保留where,一种是使用merge. 首先,High Performance Mark 提到速度和内存使用可能存在差异(想想临时数组)。我将指出另一个潜在的考虑因素(不进行价值判断)。

subroutine work_with_masked_where(my_array)
  real, intent(in) :: my_array(:)
  real, allocatable :: masked(:)

  allocate(masked(SIZE(my_array)), source=0.)
  where (my_array <=15.0) masked = my_array
  ! ...
 end subroutine

subroutine work_with_masked_merge(my_array)
  real, intent(in) :: my_array(:)
  real, allocatable :: masked(:)

  masked = MERGE(my_array, 0., my_array<=15.)
  ! ...
end subroutine
Run Code Online (Sandbox Code Playgroud)

也就是说,merge解决方案可以使用自动分配。当然,有时人们不希望这样(例如在处理大量my_array相同大小的s 时:在这些情况下检查数组大小时通常会产生开销):masked(:) = MERGE(...)在处理分配之后使用(这可能是相关的即使是问题代码)。