我正在搜索内在的fortran函数来帮助我找到带有零或其他值的数组索引。 我只发现了minloc功能,但我认为这不合适。 在Fortran中是否有matlab查找函数?
由于
答案 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
内在函数执行此操作的答案。
如果我需要对满足某些条件的所有数组元素执行操作,我会使用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
构造来实现此目的。
答案 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
循环更快。