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)
有没有更简洁的方法来做到这一点?
使用MERGE内在函数:
masked = my_array * merge(1,0,my_array<=15.0)
Run Code Online (Sandbox Code Playgroud)
或者,坚持where,
masked = 0
where (my_array <=15.0) masked = my_array
Run Code Online (Sandbox Code Playgroud)
我希望使用where和使用之间在速度和内存消耗方面存在差异,merge但我不知道它们是什么。
这里已经给出了两种不同的方法:一种是保留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(...)在处理分配之后使用(这可能是相关的即使是问题代码)。