Smoothing.R 2.03 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]
  if (nmr1 > 0) { 
    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[[numdimt]] <- jtime + nmr1
      right <- enlvar[u[[1]], u[[2]], u[[3]], u[[4]], u[[5]], u[[6]], u[[7]],
      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))
      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))
  }else{
    smt_enlano <- enlvar
  #
  #  Reduce the number of dimensions to the original one 
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #
  smt_ano <- array(dim = dimsvar)
  smt_ano[] <- smt_enlano
  #
  #  Outputs
  # ~~~~~~~~~
  #
  smt_ano