主题:怎样将数据对如数组并处理
damien
[专家分:0] 发布于 2010-12-02 05:19:00
我刚刚学习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个回复)
沙发
kltsyu [专家分:70] 发布于 2010-12-02 10:16:00
首先定义一个全是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
板凳
damien [专家分:0] 发布于 2010-12-03 06:20:00
[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 楼
kltsyu [专家分:70] 发布于 2010-12-03 16:52:00
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 楼
damien [专家分:0] 发布于 2010-12-05 18:24:00
我在别人的程序是,发现他将二维数组的值赋给了一维数组,这样作也可以??
do i=1,1000
do j=1,200
h(j)=h(i,j)
enddo
h(j)的运算
enddo
我来回复