Fortran Coder

查看: 11400|回复: 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
请您指导如何修改,谢谢!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-3-30 19:15:32 | 只看该作者
[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
  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

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

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2015-3-30 19:56:28 | 只看该作者
你把 Open(20 , Read(20 , Close(20 都改为 201

46

帖子

8

主题

0

精华

熟手

F 币
211 元
贡献
131 点
5#
 楼主| 发表于 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...) 之类的判断语句来实现?



954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
6#
发表于 2015-4-2 08:13:35 | 只看该作者
sum( c8_1_ID( 2:160 ) - c6_1_ID(1) ) / 159
这样就行了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-3 02:03

Powered by Tencent X3.4

© 2013-2024 Tencent

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