回 帖 发 新 帖 刷新版面

主题:怎样将数据对如数组并处理


我刚刚学习fortran,需要处理数据,可是遇到一个难题,问题如下:我的数据存在aaa.txt文件中。对于上面的数据,第一列是步数(step),第二列是每步的可能取值。我想将这些数据读入,并保存在数组H(io,istep)中。io可以取从1到30000但是只有当io取文件中第二列对应的值时 H(io,istep)=1,取其他值均为0.也就是说当step=1时,io取15733,18193,20251时H的值为1,取其他值都为0,当 step=2时,io取15733,20251时H的值为1,取其他值都为0。我应该怎样实现呢,我想了好久还是没想出来。先谢谢了。

1       15733
1       18193
1       20251
2       15733
2       20251
3       20824
4       15733
4       16159
4       18193
4       20251
4       20824
5       16159
5       18193
5       20251
5       20824
6       15733
6       20251
6       20824
7       15733
7       20251
7       20824
8       15733
8       16159
8       18193
8       20251
9       18193
9       20251
10        9490
10       16159
10       20251

回复列表 (共4个回复)

沙发

首先定义一个全是0值的数组,然后读取文件,根据读取的io,istep值,定义相应的数组元素值为1
program main
    real*8 :: v(1:30000,1:10)
    integer*4 :: istep,io

    v = 0.0_8
    open(11,file='aaa.txt')
    do i=1,999999999
      read(11,*,end=901)istep,io
      v(io,istep) =1.0
    enddo
    901 continue
    close(11)
end

板凳

[quote]首先定义一个全是0值的数组,然后读取文件,根据读取的io,istep值,定义相应的数组元素值为1
program main
    real*8 :: v(1:30000,1:10)
    integer*4 :: istep,io

    v = 0.0_8
    open(11,file='aaa.txt')
    do i=1,999999999
      read(11,*,end=901)istep,io
      v(io,istep) =1.0
    enddo
    901 continue
    close(11)
end[/quote]
首先非常感谢您的回答,但我还有两个疑问,(1)你写的do循环的终值999999999,是不是我要读的文件有多少行,我相应的就写多少行就可以?(2)另外如果按照上面的程序,后面我是不是直接可以引用数组v了,我想要进行下面的步骤:
do i=1,30000
   do istep=1,1000
     if(v(i,istep)/=0) then
       -----   
    enddo
enddo    
        

3 楼

1)do i=1,999999999
      read(11,*,end=901)istep,io
      v(io,istep) =1.0
    enddo
    901 continue
这段代码的含义是当程序读取到文件结束的时候,跳到901这个标识符,因此这样写的好处就是不用理会文件中有多少行。当文件中记录数超过999999999的时候会出现文件没有读完就被关闭了。
2)如果你开始定义的数组v是30000*1000的,你那样写程序没有问题。不过/=这个我没有用过,不知道行不行。我一般都是用.ne.或!=。你可以试试
3)多维数组的定义要根据系统的内存大小而定,有时候数组的维度过大会出现内存溢出的

4 楼

我在别人的程序是,发现他将二维数组的值赋给了一维数组,这样作也可以??
do i=1,1000
   do j=1,200
      h(j)=h(i,j)
   enddo
   h(j)的运算
enddo

我来回复

您尚未登录,请登录后再回复。点此登录或注册