比如 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