Rolling median algorithm in C

前端 未结 13 1755
臣服心动
臣服心动 2020-11-27 09:24

I am currently working on an algorithm to implement a rolling median filter (analogous to a rolling mean filter) in C. From my search of the literature, there appear to be t

13条回答
  •  醉酒成梦
    2020-11-27 10:06

    I have looked at R's src/library/stats/src/Trunmed.c a few times as I wanted something similar too in a standalone C++ class / C subroutine. Note that this are actually two implementations in one, see src/library/stats/man/runmed.Rd (the source of the help file) which says

    \details{
      Apart from the end values, the result \code{y = runmed(x, k)} simply has
      \code{y[j] = median(x[(j-k2):(j+k2)])} (k = 2*k2+1), computed very
      efficiently.
    
      The two algorithms are internally entirely different:
      \describe{
        \item{"Turlach"}{is the Härdle-Steiger
          algorithm (see Ref.) as implemented by Berwin Turlach.
          A tree algorithm is used, ensuring performance \eqn{O(n \log
            k)}{O(n * log(k))} where \code{n <- length(x)} which is
          asymptotically optimal.}
        \item{"Stuetzle"}{is the (older) Stuetzle-Friedman implementation
          which makes use of median \emph{updating} when one observation
          enters and one leaves the smoothing window.  While this performs as
          \eqn{O(n \times k)}{O(n * k)} which is slower asymptotically, it is
          considerably faster for small \eqn{k} or \eqn{n}.}
      }
    }
    

    It would be nice to see this re-used in a more standalone fashion. Are you volunteering? I can help with some of the R bits.

    Edit 1: Besides the link to the older version of Trunmed.c above, here are current SVN copies of

    • Srunmed.c (for the Stuetzle version)
    • Trunmed.c (for the Turlach version)
    • runmed.R for the R function calling these

    Edit 2: Ryan Tibshirani has some C and Fortran code on fast median binning which may be a suitable starting point for a windowed approach.

提交回复
热议问题