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