在Fortran数组中查找第一个和最后一个正值

时间:2018-11-26 18:04:34

标签: arrays fortran

我有一个整数数组。几个值是零,至少有几个大于零。我想找到数组中第一个和最后一个正值的位置。当然,这可以通过循环来完成。但是,对于现代的Fortran阵列功能,我认为必须有一些更紧凑,更优雅的产品。但是什么都没来。有人知道这样做的好方法吗?

2 个答案:

答案 0 :(得分:4)

我被迫回答,因为existing answer是巴洛克式的和不正确的。我的答案基于FINDLOC与LOGICAL ARRAY =和VALUE =参数一起使用的事实:

@objc func buttonAction(sender: UIButton!) {
    print("Button tapped")
    //for cancelButon
    //playerQueue = nil
    newView?.removeFromSuperview()
}

从equation.com输出的gcc版本为9.0.0 20181125(实验性)(GCC):

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

请注意,如果参数B =为零,则SIGN内在函数会给出误报。

答案 1 :(得分:2)

可以使用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