我正在寻找固有的fortran函数来帮助我找到带有零或其他值的数组索引。 我只找到minloc功能,但我认为这不适合。 在Fortran中是否有一个等价的matlab查找函数?有没有一种简单的方法在Fortran中查找索引数组零?
感谢
我正在寻找固有的fortran函数来帮助我找到带有零或其他值的数组索引。 我只找到minloc功能,但我认为这不适合。 在Fortran中是否有一个等价的matlab查找函数?有没有一种简单的方法在Fortran中查找索引数组零?
感谢
是的,看到高性能马克的关于如何使用与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
构造来实现。
给定一个整数数组,例如:
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)似乎还没有实现这一点。
+1这是正确的答案。 – milancurcic
基于pack
内在的高性能马克的解决方案是短暂而优雅的。但是,如果你的阵列相对较小,pack
搜索特定值往往比基于do
环蛮力搜索要慢一些:
do i = 1, size(testarr)
if (testarr(i) == 0) then
idx = i
exit
end if
end do
详见Craig Finch's answer。我还证实,与基于pack
的搜索相比,小阵列(< 10个元素)的蛮力do
循环更快。
注意这只能找到第一个实例。 – agentp
这会占据其更大的速度! –
这是非常有用和明确的! – marco
通常,测试写入:if(abs(a(i))