我正在寻找用于查找有零或其他值的数组索引的Fortran内在函数。我只找到了minloc函数,但我认为它不太适合。是否有类似于Matlab的find函数的Fortran等效函数?
谢谢
给定一个整数数组,例如:
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)似乎尚未实现此功能。
是的,可以参考High Performance Mark的答案,使用PACK
内置函数来实现。
如果我需要对满足某些条件的所有数组元素执行操作,我将使用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
或FORALL
结构实现。
基于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
的搜索更快。