С помощью функции Fortran 2008 findloc
это возможно.
Во-первых, вам необходимо преобразовать ваши значения так, чтобы все положительные значения имели одинаковое значение, так как findloc
находит указанное значение.Я использовал sign
для этого, так что все положительные значения равны 1
.
findloc(data, 1)
возвращает первое положительное значение (если у вас есть только -1, + 1 значения, конечно) иfindloc(data, 1, back=.true.)
последний.Пример программы ниже.
program find_positive
implicit none
integer, allocatable :: data(:)
data = [-3, 3, 0, 2, -3]
write(*,*) data
data = sign(1, data)
write(*,*) data
write(*,*) findloc(data, 1)
write(*,*) findloc(data, 1, back=.true.)
end program find_positive
Я проверил это на Intel Fortran 2018. gfortran только что включил эту функцию, но моя версия gfortran (8.2.0) пока не имеет ее.
PS: понятия не имею о производительности для ваших нужд, но функция есть: -)
РЕДАКТИРОВАТЬ: более короткая версия, предложенная High Performance Mark
program find_positive
implicit none
integer, allocatable :: data(:)
data = [-3, 3, 0, 2, -3]
write(*,*) data
write(*,*) findloc(sign(1, data), 1)
write(*,*) findloc(sign(1, data), 1, back=.true.)
end program find_positive