php 二维数组获取相同值_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

运行程序,结果如图:

7ac14cd7a00b3e908eb68b94ea0f2047.png

运行程序

这种推测运算在科学计算中经常会用到,对于无效值一般会有相邻有效值的最小值,平均值,最大值的计算替换,可以根据要求稍加改动,原理都是一样的。

3162df11821c093ec2747d3d2c8a383d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值