「在哪裏聲明」和「合併」固有功能是強大的,在陣列選定的位置工作,但他們不動項目放在數組的前面。與老式的代碼具有明確的索引(可能被打包成一個功能)例如: -
k=1
do i=1, n
if (ymiss (i) == 1) then
y(k) = y(i)
k = k + 1
end if
end do
你想要可以在使用這個「包」的內在數組內在做什麼。將ymiss轉換成一個邏輯數組:0 - > .false。,1 - > .true ..然後使用類似於(沒有第二個索引測試)的代碼:
y(1:ydim(t),t) =包(Y(:,T),YMISS(:,t))的
修改以添加例如代碼,示出使用Fortran內部的 「其中」, 「計數」 和 「包」。 「哪裏」獨自解決不了問題,但「包裝」可以。在本例中,我使用「< -90」作爲NaN。 OP不需要使用「y(ydim + 1:LEN)= -99.0」這一步,他們不需要使用這些元素。
program test1
integer, parameter :: LEN = 6
real, dimension (1:LEN) :: y = [3.0, 1.0, -99.0, 6.0, 2.0, -99.0 ]
real, dimension (1:LEN) :: y2
logical, dimension (1:LEN) :: ymiss
integer :: ydim
y2 = y
write (*, '(/ "The input array:"/6(F6.1))') y
where (y < -90.0)
ymiss = .false.
elsewhere
ymiss = .true.
end where
ydim = count (ymiss)
where (ymiss) y2 = y
write (*, '(/ "Masking with where does not rearrange:"/6(F6.1))') y2
y (1:ydim) = pack (y, ymiss)
y (ydim+1:LEN) = -99.0
write (*, '(/ "After using pack, and ""erasing"" the end:"/6(F6.1))') y
stop
end program test1
輸出是:
輸入數組: 3.0 1.0 -99.0 6.0 2.0 -99。0
掩蔽與在不重新排列: 3.0 1.0 -99.0 6.0 2.0 -99.0
使用包之後,以及 「擦除」 結束: 3.0 1.0 6.0 2.0 -99.0 -99.0