Fortran Coder

查看: 11410|回复: 5
打印 上一主题 下一主题

[求助] 一个批量运算的相关问题

[复制链接]

46

帖子

8

主题

0

精华

熟手

F 币
211 元
贡献
131 点
跳转到指定楼层
楼主
发表于 2015-3-30 18:47:38 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
问题是这样的:

数据样本为:

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同学给的例子写了一个:
[Fortran] 纯文本查看 复制代码
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
请您指导如何修改,谢谢!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

46

帖子

8

主题

0

精华

熟手

F 币
211 元
贡献
131 点
沙发
 楼主| 发表于 2015-3-30 19:38:55 | 显示全部楼层
本帖最后由 kif117 于 2015-3-30 19:41 编辑
fcode 发表于 2015-3-30 19:15
[mw_shl_code=fortran,true]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

46

帖子

8

主题

0

精华

熟手

F 币
211 元
贡献
131 点
板凳
 楼主| 发表于 2015-3-30 20:39:08 | 显示全部楼层
本帖最后由 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...) 之类的判断语句来实现?



您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-20 15:15

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表