首页 > 代码 > 常规代码 > 正文

代码

阅读排行

任意大小数组平均成任意大小数组
2014-07-16 15:01:00   来源:Fcode研讨团队 罗非鱼   评论:0 点击:

本代码提供了一种任意大小数组,每任意组元素平均的方法实现。适合于对采样数据进行平均抽取。语法规范,适合所有编译器,可直接使用。

有时候,我们得到一组数组,但希望每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
  

相关热词搜索:任意数组大小

上一篇:Unix时间戳(since1970)与日期之间互相转换
下一篇:判断字符串是否匹配通配符

分享到: 收藏