龙空技术网

Fortran二维数组推测无效值

天津IT民工老何 40

前言:

当前兄弟们对“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数组最大值