Здесь есть два разных подхода: один сохраняется 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
То есть, merge
решение может использовать автоматическое распределение. Конечно, бывают случаи, когда этого не нужно (например, при работе с большим количеством my_array
с такого же размера: при проверке размеров массивов в этих случаях часто возникают накладные расходы): используйте masked(:) = MERGE(...)
после обработки распределения (что может быть актуальным даже для кода вопроса).
Отлично! Это именно то, что я искал. – user14241
На ту же тему 'masked = MERGE (my_array, 0._blah, my_array <= 15)'. – francescalus