2016-02-27 57 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