2013-05-16 76 views

回答

2

是的,看到高性能马克的关于如何使用与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构造来实现。

+0

这是非常有用和明确的! – marco

+0

通常,测试写入:if(abs(a(i))

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的替代;我最常使用的编译器(Intel Fortran 13.1.1)似乎还没有实现这一点。

+0

+1这是正确的答案。 – milancurcic

0

基于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循环更快。

+1

注意这只能找到第一个实例。 – agentp

+0

这会占据其更大的速度! –

相关问题