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

时间:2015-02-20 19:51:43

标签: arrays fortran fortran90 masking

我想要屏蔽Fortran数组。这就是我目前的做法......

where (my_array <=15.0)
    mask_array = 1
elsewhere
    mask_array = 0
end where

然后我得到了我的蒙面数组:

masked = my_array * mask_array

有更简洁的方法吗?

3 个答案:

答案 0 :(得分:7)

使用MERGE内在函数:

masked = my_array * merge(1,0,my_array<=15.0)

答案 1 :(得分:4)

或者,坚持where

masked = 0
where (my_array <=15.0) masked = my_array

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

答案 2 :(得分:3)

此处已经提供了两种不同的方法:一种保留where,另一种使用merge。首先,高性能标记提到速度和内存使用可能存在差异(考虑临时阵列)。我将指出另一个潜在的考虑因素(不做出价值判断)。

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

也就是说,merge解决方案可以使用自动分配。当然,有时候人们并不想要这样(例如当处理大量相同大小的my_array时:在这些情况下检查数组大小时经常会有开销):use {{ 1}}处理分配后(即使对于问题代码也可能相关)。