首页 >

任意大小数组平均成任意大小数组

作者:fcode  日期:07-16
来源:Fcode研讨团队 罗非鱼
有时候,我们得到一组数组,但希望每N个元素进行平均。
比如 10 个元素的数组,每2个元素平均一组,得到结果数组为 5 个元素。

在某些情况下,我们希望得到 3 个,4 个平均值。即,每隔 3.33333 或 2.5 个数平均一组。此时,既可使用本代码进行。

如下代码,会得到结果:
原数组: 1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000
平均后: 2.200 5.500 8.800

另一组较大的数组,效果可参考下图(动画):

大图

Module AnyAvgMod
  !// AVG any size array to any size array
  !// Write by www.Fcode.cn
  Implicit None
 contains
  Subroutine AnyAvg( rN , rM )
    Real , Intent( IN ) :: rN(:)
    Real , Intent( OUT ) :: rM(:)
    integer :: n , m , i , j , e , k
    real :: rs , re , rl , rtmp , add
    n = size( rN )
    m = size( rM )
    if ( n < m ) Return
    if ( n == m ) then
      rM = rN
      return
    end if
    If ( mod( n , m ) == 0 ) then !// 常规整个数平均
      e = n / m
      Do i = 1 , m
        rs = 0.0
        Do j = (i-1)*e+1 , i*e
          rs = rs + rN(j)/e
        End Do
        rM(i) = rs
      End Do
    Else !// 小数个数平均
      re = n*1.0 / m*1.0
      rl = 0.0
      k = 1
      Do i = 1 , m
        rs = 0.0
        add = re
        rtmp = rl - int(rl)
        if ( rtmp > 0.0001 ) then !// 如果上次有剩余
          rs = rs + rN(k)*(1.0-rtmp)/re
          add = add - (1.0-rtmp)
          k = k + 1
        end if
        Do while ( add >= 1.0 )
          rs = rs + rN(k)/re
          k = k + 1
          add = add - 1.0
        End Do
        if ( add > 0.0001 ) then !//如果本次有剩余
          rs = rs + rN(k)*add / re
        end if
        rM(i) = rs
        rl = rl + re
      End Do
    End If
  End Subroutine AnyAvg
 
End Module AnyAvgMod
  
Program www_fcode_cn
  Use AnyAvgMod
  Implicit None
  real :: rA(10) = (/1,2,3,4,5,6,7,8,9,10/) , rB(3)
  call AnyAvg( rA , rB ) !// 10个数平均为3个,即每3.3333个数平均一组
  write(*,'(a,10(f6.3,1x))') '原数组:',rA(:)
  write(*,'(a,3(f6.3,1x))') '平均后:',rB(:)
End Program www_fcode_cn
  

常规|工具|专业|读物|
代码|教学|算法|
首页 >
FortranCoder手机版-导航