前言:
当前兄弟们对“fortran数组最大值”大概比较关怀,你们都需要学习一些“fortran数组最大值”的相关内容。那么小编也在网摘上汇集了一些有关“fortran数组最大值””的相关文章,希望你们能喜欢,大家快快来了解一下吧!有一个9*9的二维数组a,a中各元素的值在0-9之间。其中0代表无效值,非0值代表有效值。利用数组中的有效值(非0值)来计算推测无效值(0值),并替换无效值。
a的数值如下:
data a &
/1,0,0,1,2,5,0,5,5,&
0,8,0,6,3,6,0,5,1,&
0,0,0,0,0,0,0,0,0,&
0,1,1,1,5,9,3,0,0,&
0,1,0,0,4,0,2,0,9,&
0,0,0,6,6,0,1,2,8,&
7,2,7,0,0,1,9,0,0,&
0,0,0,0,0,0,7,5,0,&
0,0,1,0,7,0,3,0,0/
推测有效值的方法:将无效值周围8个相邻位置(边界元素和顶点元素相邻位置小于8个,按实际相邻点计算)中的有效值相加除以有效值的个数,填充当前无效值位置。
如数组a中第一行的加粗0的值,将它周围非0值即1和8的平均值(1+8)/2=4(整除)来代替。如第三行加粗的无效值,将它周围的有效值1,6,1,3,5的平均值(1+6+1+3+5)/5=3来代替。遍历a,计算并替换所有无效值,直至a中所有元素均为有效值。要求替换顺序为先列后行。
考虑到边界和顶点元素相邻位置个数不一样,不能和中间元素一样计算和替换。有的人考虑先单独计算出四个顶点和四条边所含元素中无效值,然后再循环内部元素。这样不仅代码繁琐,而且计算顺序也没有遵循先列后行的规则。我们可以考虑动态循环的方法。
代码如下:
program test55 implicit none integer,parameter::im=9,jm=9 integer::i,j,k,ss integer::dx,dx1,dx2,dy,dy1,dy2 integer::a(im,jm) data a & /1,0,0,1,2,5,0,5,5,& 0,8,0,6,3,6,0,5,1,& 0,0,0,0,0,0,0,0,0,& 0,1,1,1,5,9,3,0,0,& 0,1,0,0,4,0,2,0,9,& 0,0,0,6,6,0,1,2,8,& 7,2,7,0,0,1,9,0,0,& 0,0,0,0,0,0,7,5,0,& 0,0,1,0,7,0,3,0,0/ write(*,"(9i2)")a100 do i=1,9,1 do j=1,9,1 if(a(i,j)==0)then dx1=-1 dx2=1 dy1=-1 dy2=1 if(i==1) dx1=0 if(i==9) dx2=0 if(j==1) dy1=0 if(j==9) dy2=0 ss=0 k=0 do dx=dx1,dx2,1 do dy=dy1,dy2,1 if(a((i+dx),(j+dy))/=0)then k=k+1 ss=ss+a((i+dx),(j+dy)) end if end do end do if(k==0) k=1 a(i,j)=ss/k end if end do end do do i=1,9,1 do j=1,9,1 if(a(i,j)==0)then goto 100 end if end do end do write(*,'(60("-"))') write(*,"(9i2)")a write(*,'(60("-"))') pause stopend program test55
这段代码就是根据是否是边和顶点改变循环的起始数值。
dx1=-1 dx2=1 dy1=-1 dy2=1 if(i==1) dx1=0 if(i==9) dx2=0 if(j==1) dy1=0 if(j==9) dy2=0
为防止无效值周边皆为0值,除数不能为0。if(k==0) k=1
然后把有效值相加除以有效值个数并替换此无效值。 a(i,j)=ss/k
遍历计算替换一次以后,我们还要再遍历一次数组,如果有0值,就再次遍历循环,直至所有无效值均被计算替换。(实际上,只要数组不是全为0的值,最后肯定能全部替换成有效值)
do i=1,9,1 do j=1,9,1 if(a(i,j)==0)then goto 100 end if end do end do
运行程序,结果如图:
这种推测运算在科学计算中经常会用到,对于无效值一般会有相邻有效值的最小值,平均值,最大值的计算替换,可以根据要求稍加改动,原理都是一样的。
标签: #fortran数组最大值