2

y と ymiss の 2 つの p*n 配列があります。y には実数と NA が含まれます。ymiss には 1 と 0 が含まれるため、y(i,j)==NA の場合は ymiss(i,j)==0、それ以外の場合は 1 になります。また、y(1:p,n) に実数がいくつあるかを示す 1*n 配列 ydim があるため、ydim には 0 から p の値があります。

R プログラミング言語では、次のことができます。

if(ydim!=p && ydim!=0)  
  y(1:ydim(t), t) = y(ymiss(,t), t)

そのコードは、y(,t) のすべての実数を次のように並べます。

最初に、たとえば y(,t) = (3,1,NA,6,2,NA) があり、コードの後に​​ y(,t) = (3,1,6,2,2,NA) です

今は最初の 1:ydim(t) だけが必要なので、残りが何であるかは問題ではありません。

問題は、Fortran でそのようなことを行うにはどうすればよいかということです。

ありがとう、

上二

4

2 に答える 2

2

"where ステートメント" と "merge" 組み込み関数は強力で、配列内の選択された位置で動作しますが、アイテムを配列の先頭に移動しません。明示的なインデックス付けを伴う昔ながらのコード (関数にパッケージ化できます) の例:

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.. 次に、次のようなコードを使用します (2 番目のインデックスなしでテスト):

y(1:ydim(t), t) = パック (y (:,t), ymiss (:,t))


Fortran 組み込み関数「where」、「count」、および「pack」の使用を示すサンプル コードを追加するために編集します。「どこで」だけでは問題を解決できませんが、「パック」で解決できます。この例では、NaN として "< -90" を使用しました。ステップ「y (ydim+1:LEN) = -99.0」は、これらの要素を使用する必要がない OP には必要ありません。

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

于 2010-01-05T15:57:06.600 に答える