2016-02-27 38 views
1

我正在查找1D数组中的值0。我在这个数组中有几个0值,大部分时间是连续的0个值。现在我想要做的就是找到每个连续出现的第一个零值出现和最后一个零值出现的索引,下面我将给出一个例子来说明事情: 想象一下,我有以下数组:查找1D数组中连续标志值的索引

A= 0.0 0.0 0.0 0.0 0.0 0.0 0.38458693526004206 0.37630968444637147 0.40920888023862656 0.37240138383511134 0.38032672100490084 0.37013107455599198 0.40263333907360693 0.36804456033540955 0.41199172743738527 0.42761170349633443 0.39300715826673704 0.39783513932402137 0.44013743441396674 0.435127008833611 0.48217350280280391 0.47501246018014148 0.49234819258730078 0.54559998531569354 0.47840534103437832 0.0 0.0 0.0 0.51927791704510429 0.0 0.0 0.0 0.0 0.0 0.45862555500619961 0.50158980306905965 0.45676444815553296 0.49679306608627022 0. 0.50186256107128602 0.51714780706878094 0.53005606067091249 0.48409168179213419 0.48594430950932133 0.50963106475909081 0.49300327248076087 0.50531667704394834 0.46415085995913757 0.51930900041928330

所以我期待在第一位置和零在每个连续出现的最后一个位置,我应该得到如下:

min_loc_1=1 

max_loc_1=6 

min_loc_2=26 

max_loc_2=28 

min_loc_3=30 

max_loc_3=34 

现在我想的any组合,minlocmaxloc,或forall,但我无法弄清楚

  do ijk = 1, size(work1) 
      if (work1(ijk) .eq. 0) then 
       location1(ijk) = ijk 
      end if   
      end do 
        min_loc=minloc(location1) 
        max_loc1=maxloc(location1) 

我不能使用where,因为我调用它内部的子程序和Fortran显然并未喜欢它。

回答

1

有限量的测试让我相信,这解决了您眼前的问题。我没有广泛测试过,我会把它留给你。如果还是不行

INTEGER, DIMENSION(:),ALLOCATABLE :: b 
    LOGICAL :: zz 
    ...  
    ALLOCATE(b(0)) 
    zz = .false. 
    DO ix = 1, SIZE(a) 
    IF (.NOT.zz.AND.a(ix)==0) THEN 
     b = [b,ix] 
     zz = .TRUE. 
    END IF 
    IF (zz.AND.a(ix)/=0) THEN 
     b = [b,ix-1] 
     zz = .FALSE. 
    END IF 
    END DO 

这就产生,喂数组的时候你告诉我们,

b == [1 6 26 28 30 34] 

:它写出的开始和0 s各自运行停止的索引到数组b上诉,这也似乎工作:

b = [(ix,ix=1,SIZE(a))] 
    WHERE(a/=0.0) b = 0 
    c = PACK(b,b/=0) 
    b = PACK(c,(CSHIFT(c,1)-c)*(CSHIFT(c,-1)-c)/=-1) 

如果您无法弄清此版本坚持显式循环在第一个片段。

+0

Thanks高性能Mark,两种方法都很完美,非常感谢 – lefou

+1

被警告,进一步的测试表明,这两种方法都不能完美工作。尝试首先使用单个“0.0”进行数组测试,然后放在最后。然后找出一个修复... –

+0

好吧,我会更深入地了解一下,但我已经测试了几个数组,直到现在看来对我来说很好,如果它不工作,我会尝试找出解决方案,如果我找不到一个,我会再问一次。 – lefou