作者zmark (\-o-/)
看板Fortran
标题Re: [问题] 矩阵读资料问题
时间Fri Oct 28 10:40:36 2011
※ 引述《don1022 (向前冲)》之铭言:
: 请教板上各位,关於读矩阵写法碰到困难
: 目前有两个档案 分别以 A B 来替代
: 档案 A 格式如下 档案 B 格式如下
: 120.00 22.50 120.00 22.50 15.0
: 120.00 22.52 120.00 22.51 14.5
: 120.00 22.53 120.00 22.52 14.7
: 120.00 22.54 120.00 22.53 16.1
: 120.00 22.57 120.00 22.54 16.5
: . .
: . .
: . 120.00 22.57 18.5
: 120.00 23.55 .
: . .
: . .
: 121.50 22.10 120.00 23.55 18.1
: 意思为档案 A 内容(如120.00 22.50) 档案 B内容都有
: 我想要将档案 B 内数值(如 15.0 , 14.7 , 16.1 , 16.5等值) 写入至档案 A
: 有相同内容(如120.00 22.50 ) 後面为 15.0
: 我的想法分别将档案A 档案B 分别以矩阵方式读入
: 当我档案 A读到120.00 22.50时 去搜索档案B有相同内容的值写入
: 我是用 IF 作判断, 但是在执行时出现有矩阵大小问题
: 因为矩阵B维度较大 矩阵A维度较小
: 请教板上各位 我该如何撰写程式将矩阵B数值写入矩阵A内
: 麻烦板上各位给我指点一些方向, 谢谢大家帮忙
Hi,我是Fortran新手,提供一些我的想法给你参考
我觉得你的A,B的资料都可以用2维矩阵表示,应该不需要设不同维度。
假设你有两个纯文字文件
A.txt是
120 22.5
120 22.52
120 22.53
120 22.54
120 22.57
B.txt是
120 22.5 15
120 22.51 14.5
120 22.52 14.7
120 22.53 16.1
120 22.54 16.5
120 22.57 18.5
Program replace
implicit none
integer,parameter::n=10 !n要大於等於A,B的列数
real(kind=8)::A(3,n),B(3,n)
real(kind=8)::Tol
integer::i,j,K,L
integer::status=0
open(10,file='A.txt')
open(20,file='B.txt')
Tol = 1D-6 !容许误差
A =0
B =0
i =1
do while(.true.)
read(10,*,iostat = status ) A(1:2,i) !读取A的资料
if(status /= 0) exit
i=i+1
end do
K =i-1
i =1
do while(.true.)
read(20,*,iostat= status ) B(1:3,i) !读取B的资料
if(status /= 0) exit
i=i+1
end do
L =i-1
do i =1,K
write (*,*) A(1:3,i) !A尚未填入资料前的状态
end do
do i=1,K !若A与B前两栏相同则将B第三栏资料填入A
do j=1,L
if( abs(A(1,i) - B(1,j))< Tol .and. abs(A(2,i) - B(2,j))< Tol) then
A(3,i) = B(3,j)
end if
end do
end do
write(*,*) "============================"
do i =1,K
write (*,*) A(1:3,i) !A填入资料後的状态
end do
end program
测试过可以将B的资料正确填入A
不知道这是不是你要的?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.58.38
※ 编辑: zmark 来自: 140.114.58.38 (10/28 11:50)
※ 编辑: zmark 来自: 140.114.58.38 (10/28 15:35)
※ 编辑: zmark 来自: 140.114.58.38 (10/28 15:44)
1F:→ callmei:建议浮点数不要用==来判断 尽量用相减绝对值小於容许误差 10/30 00:35
谢谢指正! 我改好了^^
※ 编辑: zmark 来自: 61.230.193.132 (10/30 11:57)