Поиск первого и последнего положительных значений в массиве Фортрана - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть целочисленный массив.Некоторые значения равны нулю, по крайней мере, несколько больше нуля.Я хотел бы найти расположение первых и последних положительных значений в массиве.Конечно, это можно сделать с помощью петель.Но что касается современных возможностей массива Fortran, я думаю, что должно быть что-то более компактное и элегантное.Но ничего не приходит ко мне.Кто-нибудь знает хороший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я вынужден ответить, потому что существующий ответ является барочным и неправильным.Мой ответ основан на том факте, что FINDLOC работает с аргументами LOGICAL ARRAY = и VALUE =:

program find
   integer, allocatable :: data(:)
   data = [-3, 3, 2, 0, -2]
   write(*,'(*(g0))') 'First Positive = ',findloc(data > 0, .TRUE.)
   write(*,'(*(g0))') 'Last Positive = ',findloc(data > 0, .TRUE., BACK = .TRUE.)
   write(*,*) findloc(sign(1, data), 1)
   write(*,*) findloc(sign(1, data), 1, back=.true.)
end program find

Вывод с версией gcc 9.0.0 20181125 (экспериментальная) (GCC) из уравнение.com :

First Positive = 2
Last Positive = 3
           2
           4

Обратите внимание, что встроенная функция SIGN дает ложные срабатывания, если аргумент B = равен нулю.

0 голосов
/ 26 ноября 2018

С помощью функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...