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



