Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Fortran数组中查找第一个和最后一个正值_Arrays_Fortran - Fatal编程技术网

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

Arrays 在Fortran数组中查找第一个和最后一个正值,arrays,fortran,Arrays,Fortran,我有一个整数数组。有几个值为零,至少有几个大于零。我想找到数组中第一个和最后一个正值的位置。当然,这可以通过循环来实现。但由于现代Fortran阵列的功能,我认为一定有更紧凑、更优雅的东西。但我什么也没想到。有人知道这样做的好方法吗?使用Fortran 2008功能findloc这是可能的 首先,您需要转换您的值,使所有正值具有相同的值,如findloc查找指定值。为此,我使用了符号,因此所有正值都等于1 findloc(data,1)返回第一个正值(如果只有-1,当然是+1个值)和findlo

我有一个整数数组。有几个值为零,至少有几个大于零。我想找到数组中第一个和最后一个正值的位置。当然,这可以通过循环来实现。但由于现代Fortran阵列的功能,我认为一定有更紧凑、更优雅的东西。但我什么也没想到。有人知道这样做的好方法吗?

使用Fortran 2008功能
findloc
这是可能的

首先,您需要转换您的值,使所有正值具有相同的值,如
findloc
查找指定值。为此,我使用了
符号
,因此所有正值都等于
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
我已经在英特尔Fortran 2018上对此进行了测试。gfortran刚刚包含了该功能,但我的gfortran版本(8.2.0)还没有

PS:不知道性能是否能满足您的需求,但功能是存在的:-)

编辑:高性能标记建议的较短版本

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

使用Fortran 2008功能
findloc
是可能的

首先,您需要转换您的值,使所有正值具有相同的值,如
findloc
查找指定值。为此,我使用了
符号
,因此所有正值都等于
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
我已经在英特尔Fortran 2018上对此进行了测试。gfortran刚刚包含了该功能,但我的gfortran版本(8.2.0)还没有

PS:不知道性能是否能满足您的需求,但功能是存在的:-)

编辑:高性能标记建议的较短版本

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

我被迫回答这个问题,因为它是巴洛克式的,而且不正确。我的答案基于这样一个事实:FINDLOC与逻辑数组=和值=参数一起工作:

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
equation.com中gcc版本9.0.0 20181125(实验)(gcc)的输出:

First Positive = 2
Last Positive = 3
           2
           4

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

我被迫回答,因为该参数是巴洛克式的,不正确。我的答案基于这样一个事实:FINDLOC与逻辑数组=和值=参数一起工作:

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
equation.com中gcc版本9.0.0 20181125(实验)(gcc)的输出:

First Positive = 2
Last Positive = 3
           2
           4

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

我不知道有什么类似的,它真的太专业化了。我不知道有什么类似的,它真的太专业化了。是的,这是可能的,事实上很明显,但是计算
data=SIGN(1,data)
对我来说似乎太多的工作了。数组越大,性能越差。
findloc(符号(1,数据),1)
也应该可以工作,无需显式声明辅助数组。@VladimirF许多高级操作都有成本,必须根据上下文进行权衡。我不会隐瞒的,谢谢!不幸的是,我的gfortran也没有,而且我也没有访问英特尔的权限。我会记住这一点。再次感谢。如果您想尝试新功能,可以使用windows的二进制文件来获取gfortran的最新快照。是的,这是可能的,而且事实上非常明显,但是计算
data=sign(1,data)
对我来说似乎太多了。数组越大,性能越差。
findloc(符号(1,数据),1)
也应该可以工作,无需显式声明辅助数组。@VladimirF许多高级操作都有成本,必须根据上下文进行权衡。我不会隐瞒的,谢谢!不幸的是,我的gfortran也没有,而且我也没有访问英特尔的权限。我会记住这一点。再次感谢。如果您想尝试新功能,可以使用windows的二进制文件来获取gfortran的最新快照。很好的解决方案:-)我担心它不能与ifort或gfortran 8.2一起使用,但是。。。我们需要等待一点更新。我的答案在哪方面是不正确的?@Pierredebyl是的,gfortran的equation.com构建实际上不起作用,但足以编译我的示例。看看我的示例中的数据数组:最后一个正值的正确值是#3,因为我的方法产生了#3,而您的代码产生的结果是#4。对于整型数组,就像问题的原始陈述一样,修复起来很容易,但是对于真正的数组,修复起来不是有点棘手吗?你能提供这样一个在-0.0存在或不存在的情况下都能工作的修复程序吗?很好的解决方案:-)我担心它在ifort或gfortran 8.2中不起作用。。。我们需要等待一点更新。我的答案在哪方面是不正确的?@Pierredebyl是的,gfortran的equation.com构建实际上不起作用,但足以编译我的示例。看看我的示例中的数据数组:最后一个正值的正确值是#3,因为我的方法产生了#3,而您的代码产生的结果是#4。对于整型数组,就像问题的原始陈述一样,修复起来很容易,但是对于真正的数组,修复起来不是有点棘手吗?您能否提供这样一个在有无-0.0的情况下工作的修复程序?