我想要屏蔽Fortran数组。这就是我目前的做法......
where (my_array <=15.0)
mask_array = 1
elsewhere
mask_array = 0
end where
然后我得到了我的蒙面数组:
masked = my_array * mask_array
有更简洁的方法吗?
答案 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}}处理分配后(即使对于问题代码也可能相关)。