我有以下数据
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 0X和Y表示4乘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
发布于 2012-06-16 01:25:31
照ja72说的做。您有三个大小相同的一维数组(16)。你所需要做的就是在1和16之间选择一个数字,检查INFTIME是否为0,并根据需要接受这个值,然后重复,直到你取了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调用ind=1+int(625*rand(seed))将在1(当为rand(seed)=0时)到625 (当为rand(seed)=1时)之间选取一个随机整数。然后,如果满足if语句,则可以执行所需的操作。
编辑: program 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 programEDIT 2我已经调整了程序来修复一些问题。我试着保持我的编辑是小写的,这样你就可以看到不同之处。do-while循环允许代码继续运行,直到满足条件my_cnt.le.63 (这意味着每个T有63行X,Y,inftime )。我添加了一行用于输出T,另一行用于添加空格,以便在查看输出时数据可能更清晰。
这应该会解决你遇到的所有问题。如果没有,我会继续查看这个页面。
https://stackoverflow.com/questions/11054955
复制相似问题