Fortran中有没有一种简单的方法来查找索引数组中的零?

6

我正在寻找用于查找有零或其他值的数组索引的Fortran内在函数。我只找到了minloc函数,但我认为它不太适合。是否有类似于Matlab的find函数的Fortran等效函数?

谢谢

3个回答

10

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

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

然后是表达式

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

将返回与 testarr 中的元素相等的索引,其值为 0

我将让您将其推广或增强以处理实数,或将其封装为适合您目的的函数。

Fortran 2008 标准添加了一个新的内在函数 findloc,可作为此问题所寻求的 Matlab 的 find 的替代品;我使用最多的编译器(Intel Fortran 13.1.1)似乎尚未实现此功能。


2

是的,可以参考High Performance Mark的答案,使用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结构实现。


通常情况下,测试代码会这样写:如果(abs(a(i)) < eps),那么... - Francois Jacq

0

基于pack内置函数的高性能Mark方案简短而优雅。但是,如果您的数组相对较小,在使用pack搜索特定值时,与基于do循环的蛮力搜索相比,速度通常会变慢:

do i = 1, size(testarr)

  if (testarr(i) == 0) then

    idx = i
    exit

  end if

end do

请参考Craig Finch的答案了解详情。我还验证了对于小数组(<10个元素),暴力do循环比基于pack的搜索更快。


1
那就解释了它更快的速度! - High Performance Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接