«Где оператор» и «слияние» внутренняя функция могущественны, работающих на отдельных позициях в массивах, но они не двигаются элементы перед фронтом массива. С старомодным кодом с явной индексацией (может быть упакована в функцию) например .:
k=1
do i=1, n
if (ymiss (i) == 1) then
y(k) = y(i)
k = k + 1
end if
end do
То, что вы хотите, может быть сделаны с встроенными функциями массива, используя «пакет» внутренний. Преобразуйте ymiss в логический массив: 0 -> .false., 1 -> .true .. Затем используйте код (проверенный без второго индекса):
y (1: ydim (t), t) = упаковка (у (:, т), ymiss (:, т))
Изменить, чтобы добавить пример кода, показывающий использование Fortran встроенных функций "где", "подсчет" и "пакет". «где» один не может решить проблему, но «пакет» может. Я использовал «< -90» как NaN для этого примера. Оператор OP не должен выполнять шаг «y (ydim + 1: LEN) = -99.0», которому не нужно использовать эти элементы.
program test1
integer, parameter :: LEN = 6
real, dimension (1:LEN) :: y = [3.0, 1.0, -99.0, 6.0, 2.0, -99.0 ]
real, dimension (1:LEN) :: y2
logical, dimension (1:LEN) :: ymiss
integer :: ydim
y2 = y
write (*, '(/ "The input array:"/6(F6.1))') y
where (y < -90.0)
ymiss = .false.
elsewhere
ymiss = .true.
end where
ydim = count (ymiss)
where (ymiss) y2 = y
write (*, '(/ "Masking with where does not rearrange:"/6(F6.1))') y2
y (1:ydim) = pack (y, ymiss)
y (ydim+1:LEN) = -99.0
write (*, '(/ "After using pack, and ""erasing"" the end:"/6(F6.1))') y
stop
end program test1
Выход:
Входной массив: 3,0 1,0 -99,0 6,0 2,0 -99.0
Маскирование с тем, где не переставить: 3,0 1,0 6,0 2,0 -99,0 -99.0
После использования пакета, и «стирание» конец: 3,0 1,0 6,0 2,0 -99,0 -99,0