Smoothing.R 1.59 KB
Newer Older
Smoothing <-
function( var, runmeanlen=12, numdimt=4 ) {
#===============================================================================
#
#  Enlarge the number of dimensions of var to 10 --> enlvar 
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dimsvar=dim(var)
if ( is.null(dimsvar) ) { dimsvar=length(var) }
u=inilistdims(dimsvar,10)
enlvar=enlarge(var,10)
#
#  Smoothing 
# ~~~~~~~~~~~
smt_enlano=array(dim=c(dimsvar,array(1,dim=(10-length(dimsvar)))))

nmr1=floor(runmeanlen/2)
nltime=dimsvar[numdimt]
for (jtime in (1+nmr1):(nltime-nmr1)){
  # First, averaging the two extreme values
  u[[numdimt]]=jtime-nmr1
  left=enlvar[u[[1]],u[[2]],u[[3]],u[[4]],u[[5]],u[[6]],u[[7]],u[[8]],u[[9]],u[[10]]]
  u[[numdimt]]=jtime+nmr1
  right=enlvar[u[[1]],u[[2]],u[[3]],u[[4]],u[[5]],u[[6]],u[[7]],u[[8]],u[[9]],u[[10]]]
  u[[numdimt]]=jtime
  smt_enlano[u[[1]],u[[2]],u[[3]],u[[4]],u[[5]],u[[6]],u[[7]],u[[8]],u[[9]],u[[10]]]=(left+right)/(2*(2*nmr1))
  if ( nmr1 > 0 ) { 
    for (k in -(nmr1-1):(nmr1-1)){
    # Second, adding the equally-weighted values around the centered
      u[[numdimt]]=jtime+k
      mid=enlvar[u[[1]],u[[2]],u[[3]],u[[4]],u[[5]],u[[6]],u[[7]],u[[8]],u[[9]],u[[10]]]
      u[[numdimt]]=jtime
      smt_enlano[u[[1]],u[[2]],u[[3]],u[[4]],u[[5]],u[[6]],u[[7]],u[[8]],u[[9]],u[[10]]]=smt_enlano[u[[1]],u[[2]],u[[3]],u[[4]],u[[5]],u[[6]],u[[7]],u[[8]],u[[9]],u[[10]]]+(mid/(2*nmr1))
    }
  }
}
#
#  Reduce the number of dimensions to the original one 
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
smt_ano=array(dim=dimsvar)
smt_ano[]=smt_enlano
#
#  Outputs
# ~~~~~~~~~
#
smt_ano
#
}