我正在寻找内在的 fortran 函数来帮助我找到带有零或其他值的数组索引。我只找到了 minloc 函数,但我认为这不合适。在 Fortran 中是否有等效的 matlab 查找函数?
谢谢
给定一个整数数组,例如:
testarr = [0,1,0,2,0,3,0,4]
然后表达式
pack([(ix,ix=1,size(testarr))],testarr==0)
将返回testarr
等于的元素的索引0
。
我将让您对其进行概括或增强以处理实数或将其包装到适合您目的的函数中。
Fortran 2008 标准增加了一个新的内在函数findloc
,它可以替代find
问题所寻求的 Matlab;我最常使用的编译器(Intel Fortran 13.1.1)似乎还没有实现这一点。
是的,请参阅 High Performance Mark 的回答,了解如何使用PACK
intrinsic 功能做到这一点。
如果我需要对满足某个条件的所有数组元素执行操作,我会使用DO
和IF
构造的组合来实现它,例如:
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)
来防止由于浮点运算导致比较失败。如果使用整数,则可以进行精确==
比较。
如果只需要对数组元素进行赋值操作,则可以使用WHERE
orFORALL
构造来实现。
High Performance Mark 基于pack
内在函数的解决方案简洁而优雅。但是,如果您的数组相对较小,则搜索特定值pack
往往比基于do
循环的蛮力搜索要慢:
do i = 1, size(testarr)
if (testarr(i) == 0) then
idx = i
exit
end if
end do
有关详细信息,请参阅Craig Finch 的答案。我还验证了与基于搜索do
相比,对于小数组(< 10 个元素),蛮力循环更快。pack