一个批量运算的相关问题
问题是这样的:数据样本为:
1 5.402000 -4.100000 6.486000
2 5.106000 10.426000 14.167000
3 8.123000 20.117000 -1.005000
4 -11.142000 17.711000 3.485000
5 -17.692000 8.982000 -10.812000
.....
160 ...
每个文件包含160个ID, 一共有几万个那么多。但是不需要全部使用,我单挑选那些文件号为10的倍数的来用,这样需要处理的文件个数为几千个。我希望结果是以ID号作为RESULT_(ID号)文件名,然后里面包含提取出几千个的数据。
我参考论坛里另外一个帖子(数据分类问题求助),仿照着fcode同学给的例子写了一个:
Program main
Implicit None
Character(160) :: Filename
Character(160) :: fn1,fn2,fn3,tmp
Integer :: I, J,num
real :: A(4), B(4), C(4)
integer ios
fn1='c6c8_ID_'
fn2='c6_'
fn3='c8_'
num=160! total number of result files
print*, 'Running'
do J = 1, num
write (tmp,*)J
C print*, J
open (j,File="D:\c6c8\"//trim(adjustl(fn1))//trim(adjustl(tmp))//'.dat',status='unknown') ! save result here
write (j,'(3f8.3)') 0.0,0.0,1.0
enddo
open (20, File='IDlist.dat',status='old') ! 里面存放的是10的倍数,共计9200个。
do I = 1, 9200
read (20, *,iostat=ios) Filename
if (ios /=0) then
exit
endif
c print*, filename
open (200,File="D:\C6\"//trim(adjustl(fn2)) //trim(adjustl(filename))//'.dat')
open (300,File="D:\C8\"//trim(adjustl(fn3)) //trim(adjustl(filename))//'.dat')
Do J = 1, num
Read (200, *) A(:)! first row=ID number, then x,y,z
Read (300, *) B(:)! first row=ID number
C(:)=B(:)-A(:)
c print*, c(:)
Write (c(1), '(3f8.3)') C(2:4) ! first row=ID number
Close (300)
Close (200)
enddo
enddo
Close (20)
Do J = 1, num
Close (J)
End Do
End Program
请您指导如何修改,谢谢! Program main
Implicit None
Character (160) :: filename
Character (160) :: fn1, fn2, fn3, tmp
Integer :: i, j, num
Real :: a(4), b(4), c(4)
Integer ios
fn1 = 'c6c8_ID_'
fn2 = 'c6_'
fn3 = 'c8_'
num = 160 ! total number of result files
Print *, 'Running'
Do j = 1, num
Write (tmp, *) j
!c print*, j
Open (j, File='D:\c6c8\'//trim(adjustl(fn1))//trim(adjustl(tmp))//'.dat', Status='unknown') ! save result here
Write (j, '(3f8.3)') 0.0, 0.0, 1.0
End Do
Open (20, File='IDlist.dat', Status='old') ! 里面存放的是10的倍数,共计9200个。
Do i = 1, 9200
Read (20, *, Iostat=ios) filename
If (ios/=0) Exit
! print*, filename
Open (200, File='D:\C6\'//trim(adjustl(fn2))//trim(adjustl(filename))//'.dat')
Open (300, File='D:\C8\'//trim(adjustl(fn3))//trim(adjustl(filename))//'.dat')
Do j = 1, num
Read (200, *) a(:) ! first row=ID number, then x,y,z
Read (300, *) b(:) ! first row=ID number
c(:) = b(:) - a(:)
!c print*, c(:)
Write ( j , '(3f8.3)') c(2:4) ! write( j ,
End Do
Close (300)!// Close 在循环外面
Close (200)
End Do
Close (20)
Do j = 1, num
Close (j)
End Do
End Program main 本帖最后由 kif117 于 2015-3-30 19:41 编辑
fcode 发表于 2015-3-30 19:15
Program main
Implicit None
Character (160) :: filename
您好! 我这样改过以后,目前的result是160个ID文件里只有(0,0,1)和一行不知道具体从哪里提取的(X,Y,Z)。
又新发现: 原来存为9200个挑选的文件号的IDList 被重写成这样:
10
0.415-4.906-3.266
你把 Open(20 , Read(20 , Close(20 都改为 201 本帖最后由 kif117 于 2015-3-31 02:49 编辑
fcode 发表于 2015-3-30 19:56
你把 Open(20 , Read(20 , Close(20 都改为 201
应该是文件号的问题,这种compile时不出现的错误实在很难察觉。我接下来把问题做得‘更难’了一些,是这样的:
现在我想这样求: 比照之前统计各个ID的情况,现在想做这样的运算:
针对一种类数据(c6)的ID1,计算它和另一种类数据(c8)其他159个ID的c(:)=B(:)-A(:),再求平均。(比如说C6_1中ID1的数值,和C8_1的ID(2至160)共159个其他ID的数值做差后求平均,作为result_1的第一行数据,...以此类推,一直做完全部9200个文件。)
是不是只能通过进行比较 if (id...) 之类的判断语句来实现?
sum( c8_1_ID( 2:160 ) - c6_1_ID(1) ) / 159
这样就行了
页:
[1]