0

私は次のデータを持っています

X     Y    INFTIME
1     1     0
1     2     4
1     3     4
1     4     3
2     1     3
2     2     1
2     3     3
2     4     4
3     1     2
3     2     2
3     3     0
3     4     2
4     1     4
4     2     3
4     3     3
4     4     0

X と Y は、4 x 4 の正方格子の X と Y のコンポーネントを表します。ここでは、感染している人口からランダムに 10% をサンプリングしたいと考えています。つまり、その INFTIME はゼロではありません。コーディングのアイデアがまったくなかったので、始めることができませんでした。どんな提案やアイデアも私にとって素晴らしいものです。ありがとう

編集:

DO T = 1,10
   DO i = 1, 625

      IF(INFTIME(i)/=0 .AND. INFTIME(i) .LE. T)THEN
         CALL RANDOM_NUMBER(u(i))
         u(i) = 1+aint(u(i)*25)
          CALL RANDOM_NUMBER(v(i))
         v(i) = 1+aint(v(i)*25)
          CALL RANDOM_NUMBER(w(i))
         w(i) = 1+aint(w(i)*10)
      ENDIF
   ENDDO
ENDDO


do p = 1,625
  WRITE(*,*) u(p),v(p),w(p)
 enddo

これは私が試した私のコードですが、データへの接続ではなく、乱数のみを提供します。25 x 25 グリッドのデータ、つまり 625 人、感染時間 1 ~ 10 のデータを使用しました。

4

1 に答える 1

1

ja72が言ったことに従ってください。同じサイズ (16) の 3 つの 1D 配列があります。必要なのは、1 から 16 の間の数値を選択し、INFTIME がゼロかどうかを確認し、必要に応じて値を受け入れ、サンプルの 10% を取得するまで繰り返すことです (これは 1.6 の値になるので、私は推測します)。 2 だけでいいですか? それとも、提示したこの 4x4 よりも多くのデータがありますか?)

編集ステートメントの前に乱数ジェネレーターを呼び出す必要があります。if

    do t=1,10
      do i=1,625
          ind = 1+int(624*rand(seed))
          if(inftime(ind).neq.0 .and. inftime(ind).le.t) then
             stuff
          endif
       enddo
    enddo

この呼び出しは、1 ( の場合) から 625 ( の場合)ind=1+int(625*rand(seed))までのランダムな整数を選択します。その後、ステートメントが満たされている場合は、必要なことを行うことができます。rand(seed)=0rand(seed)=1if

編集: プログラム エピマトリックス

IMPLICIT NONE
INTEGER ::l, i,T,K
REAL, DIMENSION(1:625):: X,y,inftime
INTEGER::seed,my_cnt
INTEGER,DIMENSION(8) :: time1
CALL DATE_AND_TIME(values=time1)
seed = 1000*time1(7)+time1(8)
call srand(seed)

OPEN(10, FILE = 'epidemicSIR.txt', FORM = 'FORMATTED')
DO l = 1,625
   READ(10,*,END = 200) X(l), Y(l), INFTIME(l)
  ! WRITE(*,*) X(l),Y(l), INFTIME(l)
  ! if you know how it was formatted, you should use
  ! read(10,20) X(l), Y(l), INFTIME(l)
  ! where 20 is the format
ENDDO
200 CONTINUE
CLOSE(10)

DO T = 1,10
   my_cnt=0
   write(*,*) "T=",T
   DO while (my_cnt.le.63)
      K = 1+int(624*rand())
      IF(INFTIME(K)/=0 .AND. INFTIME(K) .LE. T)THEN
         write(*,*) X(k),Y(k),INFTIME(k)
         my_cnt=my_cnt+1
      ENDIF
   enddo
   write(*,*) " "
ENDDO

end program

編集 2 プログラムを調整して、いくつかの問題を修正しました。違いがわかるように、編集内容を小文字にしてみました。do-whileループにより、条件が満たされるまでコードを実行し続けることができます(つまり、 T ごとmy_cnt.le.63に X、Y、inftime の 63 行があることを意味します)。T を出力するための行と、スペースを追加するための別の行を追加して、出力を見たときにデータがより明確になるようにしました。

これにより、これまでに遭遇したすべての問題が解決されるはずです。そうでない場合は、このページをチェックし続けます。

于 2012-06-15T17:25:30.587 に答える