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) 的一维数组。您需要做的就是选择一个介于 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

编辑:程序epimatrix

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循环允许代码继续运行,直到满足条件(这意味着每个 Tmy_cnt.le.63有 63 行 X、Y、inftime )。我已经添加了一行来输出 T 和另一行来添加一个空格,以便在查看输出时数据可能更清晰。

这应该可以解决您遇到的所有问题。如果没有,我会继续检查这个页面。

于 2012-06-15T17:25:30.587 回答