2011-12-02 97 views
0

我想通過訪問fortran中的邊界元素來檢查我的數組是否返回廢話。我想檢查這些值是否小於1,如果是,請將它們更改爲1。在陣列上操作元素

這是一張我的代碼引起的問題:

lastNeighLabel=(/clusterLabel(jj-1,kk,ll), clusterLabel(jj,kk-1,ll), clusterLabel(jj,kk,ll-1)/) LastNeighLabel包含集羣標籤(介於1到n,其中n isthe發現獨特的獨立簇的總數)在x的最後一個鄰居, y,z方向。

jjkkll是1,他們嘗試和在陣列中訪問第0個元素,並且如在陣列1 FORTRAN計數,它試圖破壞宇宙。我目前糾結在大約8個if/elseif語句試圖爲每個可能性編碼。但我希望在每個元素上都有一種操作方式。所以基本上我想說where((/jj-1,kk-1,ll-1/).lt.1) do clusterLabel(jj-1,kk,ll)=0 etc取決於哪個元素導致問題。

但我不能想辦法做到這一點,因爲哪裏只會操縱傳遞給它的變量,而不是在同一個索引處的不同數組。或者我錯了?

如果這沒有意義,會很樂意編輯。

+0

你想有例如lastNeighLabel =(/ 0,clusterLabel(JJ,KK-1,LL),clusterLabel(JJ,KK,LL-1)/)如果JJ == 0? –

+0

是的,這就是我所追求的。 – Pureferret

回答

2

也許你可以使用一個函數?

real function f(A,i,j,k) 
    real :: A(:,:,:) 
    integer :: i,j,k 

    if (i==0.or.j==0.or.k==0) then 
    f=0 
    else 
    f=A(i,j,k) 
    endif 

    end function f 

,然後使用f(clusterLabel,JJ-1,KK,LL)等

+0

啊我想我跟着。 因此,如果clusterLabel的任何元素爲0,則返回0? 如何將該功能放入程序中?它會返回數組嗎? – Pureferret

+0

是的,我的意思是。當然,類似的上限,你可以傳遞上限到函數或使用UBOUND內在。 –

+0

我設計代碼的方式只能看到之前的鄰居(因此-1),它不應該看上邊界。如果是這樣,我會遵照你的建議。否則,謝謝。現在去試試。 – Pureferret

4

這不是強制性的是Fortran的訪問從1開始陣列。任何初始值都是允許的。如果更方便,你有一個零索引的數組,聲明數組爲:

real, dimension (0:N-1, 0:M-1) :: array 

或者

real, dimension (0:N, 0:M) :: array 

,並有0指數要格外趕上特殊情況。

這可能是您的問題的另一種解決方案,因爲零指數值是合法的。

+0

當然是對的。在許多情況下這將是更好的選擇。 –

3

解決這個問題的另一種可能的方法是創建一個擴展簇標籤數組(索引界限從0開始),該數組等於具有外部零層的簇標籤數組。然後,您可以讓循環安全地運行jj,kk和ll的所有值。這取決於數組的大小,如果這是一個可行的解決方案。

 
integer :: extended_cluster_label(0:size(cluster_label,1), & 
            0:size(cluster_label,2), & 
            0:size(cluster_label,3) & 
           ) 

extended_cluster_label(0,:,:) = 0 
extended_cluster_label(:,0,:) = 0 
extended_cluster_label(:,:,0) = 0 

extended_cluster_label(1:, 1:, 1:) = cluster_label