有没有一种简单的方法可以在Fortran中找到索引数组零?

时间:2013-05-16 13:02:20

标签: arrays matlab indexing find fortran

我正在搜索内在的fortran函数来帮助我找到带有零或其他值的数组索引。 我只发现了minloc功能,但我认为这不合适。 在Fortran中是否有matlab查找函数?

由于

3 个答案:

答案 0 :(得分:7)

给定一个整数数组,例如:

testarr = [0,1,0,2,0,3,0,4]

然后是表达式

pack([(ix,ix=1,size(testarr))],testarr==0)

将返回testarr中等于0的元素的索引。

我会让你概括或加强这个来处理实数或将它包装成一个适合你目的的函数。

Fortran 2008标准添加了一个新的内在函数findloc,它可以替代Matlab的问题find。我最常使用的编译器(英特尔Fortran 13.1.1)似乎还没有实现这一点。

答案 1 :(得分:2)

是的,请参阅高性能标记关于如何使用PACK内在函数执行此操作的答案。

如果我需要对满足某些条件的所有数组元素执行操作,我会使用DOIF结构的组合来实现它,例如:

INTEGER :: i
REAL,DIMENSION(10) :: a
REAL :: eps = someSmallNumber
...
DO i = 1,SIZE(a)
  IF( 0 > a(i)-eps .AND. 0 < a(i)+eps )THEN
    ...
  ENDIF
ENDDO

上面使用范围(a(i)-eps,a(i)+eps)来防止由于浮点运算导致的比较失败。如果使用整数,则会进行精确的==比较。

如果只需要对数组元素进行赋值操作,则可以使用WHEREFORALL构造来实现此目的。

答案 2 :(得分:0)

高性能Mark基于pack内在的解决方案简洁而优雅。但是,如果您的数组相对较小,则使用pack搜索特定值的速度往往比基于do循环的强力搜索慢:

do i = 1, size(testarr)

  if (testarr(i) == 0) then

    idx = i
    exit

  end if

end do

有关详细信息,请参阅Craig Finch's answer。我还验证,与基于do的搜索相比,小型数组(&lt; 10个元素)的强力pack循环更快。