我有以下数据
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乘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乘25个网格的数据,即625个人和感染时间1到10
答案 0 :(得分:0)
遵循ja72的说法。你有三个相同大小的1D阵列(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
调用ind=1+int(625*rand(seed))
将选择1(rand(seed)=0
)和625(rand(seed)=1
时)之间的随机整数。然后,如果满足if
语句,您就可以执行所需的操作。
编辑:程序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
循环允许代码继续运行,直到满足条件my_cnt.le.63
(这意味着你有63行X,Y,inftime 每T )。我在输出T和另一行添加了一行来添加空格,以便在查看输出时数据可能更清晰。
这应该解决您遇到的所有问题。如果没有,我会继续查看此页面。