Fortran Coder

标题: 很多数据中固定区域求平均,在新文件中输出 [打印本页]

作者: 上帝19岁    时间: 2015-4-4 11:36
标题: 很多数据中固定区域求平均,在新文件中输出
因对文件格式要求严格,在纵向每个数加上空格一共16个字符,计算后也要保持这样的格式,数据见附件。
现在想把每4个数围成的矩阵求平均,得到一个数,然后在新文件里输出。比如说第一行第一列,第一行第二列,第二行第一列,第二行第二列这四个数求平均得到一个数;    第一行第三列,第一行第四列,第二行第三列,第二行第四列这四个数求平均得到一个数;一次类推。然后所有得到的平均数在另一个文件中输出,格式要保持不变。

试了很多次,得不到想要的结果,各位大神帮帮忙啊!!




作者: 楚香饭    时间: 2015-4-4 11:36
[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  Implicit None
  Integer , parameter :: DP = Selected_Real_Kind( p = 13 ) !// 需保留13位有效数字
  Integer , parameter :: NC = 18 !// 列
  Integer , parameter :: NR = 14 !// 行
  Real(Kind = DP ) :: rData(NC,NR) , rDataLite(NC/2,NR/2)
  integer :: i , j
  Open( 12 , File = "1.dat" )
  Open( 13 , File = "输出.dat" )
  Do i = 1 , NR
    Read( 12 , * ) rData( : , i )
  End Do
  Do i = 1 , size(rDataLite,dim=2)
    Do j = 1 , size(rDataLite,dim=1)
      rDataLite( j , i ) = sum( rData( 2*j-1:2*j , 2*i-1:2*i  ) ) / 4.0_DP
    End Do
    Write( 13 , '(100f16.8)' ) rDataLite( : , i )
  End Do  
  Close( 13 )
  Close( 12 )
End Program www_fcode_cn

作者: 上帝19岁    时间: 2015-4-4 11:37
文件传上了

1.zip

1.78 KB, 下载次数: 1

文件


作者: 上帝19岁    时间: 2015-4-4 14:42
楚香饭 发表于 2015-4-4 12:19
[mw_shl_code=fortran,true]Program www_fcode_cn
  Implicit None
  Integer , parameter :: DP = Selecte ...

谢谢大神,我试了一下。是我没表达清楚。不知道怎么传图片,我在新回复里传了一张压缩后的,麻烦大神看一下,图里边每个格子代表一个数。18列14行的数据求平均以后应该是9列4行。谢谢!
作者: 上帝19岁    时间: 2015-4-4 14:42
图片,谢谢   

求平均.png (8 KB, 下载次数: 1070)

求平均.png

作者: 上帝19岁    时间: 2015-4-4 14:43
楚香饭 发表于 2015-4-4 12:19
[mw_shl_code=fortran,true]Program www_fcode_cn
  Implicit None
  Integer , parameter :: DP = Selecte ...

说错了,是9行7列
作者: 楚香饭    时间: 2015-4-4 14:56
18列14行,平均后应该为 9列7行,而不是9行7列。

我的代码正是这样

作者: 上帝19岁    时间: 2015-4-4 18:54
本帖最后由 上帝19岁 于 2015-4-4 18:55 编辑
楚香饭 发表于 2015-4-4 14:56
18列14行,平均后应该为 9列7行,而不是9行7列。

我的代码正是这样

是的,是我大意了。这个代码是不错的。数据较小量的时候没问题,数据多了就会出现格式问题,麻烦再帮忙看下。我用的notepad++打开的 ,求平均后得到的数据有些乱,格式对不上。

这个是320列120行转160列60行。

前后对比.zip

616.11 KB, 下载次数: 14


作者: fcode    时间: 2015-4-4 19:26
把 17 行的
Write( 13 , '(100f16.8)' ) rDataLite( : , i )
改成
Write( 13 , '(400f16.8)' ) rDataLite( : , i )
就行了。

如果再大,你就把 400 改得更大
作者: 上帝19岁    时间: 2015-4-4 21:52
fcode 发表于 2015-4-4 19:26
把 17 行的
Write( 13 , '(100f16.8)' ) rDataLite( : , i )
改成

谢谢 ,可以了!因文件很多,好几千个,需要批量处理这样的文件,麻烦能帮忙加一个批量操作的循环吗?
作者: fcode    时间: 2015-4-4 22:54
如果你用的是 IVF 系列编译器,可参考本站文章:http://fcode.cn/code_gen-12-1.html
作者: 上帝19岁    时间: 2015-4-4 23:00
fcode 发表于 2015-4-4 22:54
如果你用的是 IVF 系列编译器,可参考本站文章:http://fcode.cn/code_gen-12-1.html

好的,学习下




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2