X-Git-Url: https://git.auder.net/doc/screen_pairings_restore.png?a=blobdiff_plain;f=epclust%2Fsrc%2Ffilter.cpp;h=175000032af80c1e7ad30b1ba2d6889f2bbd56a4;hb=a52836b23adb4bfa6722642ec6426fb7b5f39650;hp=cb5a8a0b5d58e553770401accff99438fe0af73f;hpb=0fe757f750f51e580d2c5a7b7f7df87cc405d12d;p=epclust.git diff --git a/epclust/src/filter.cpp b/epclust/src/filter.cpp index cb5a8a0..1750000 100644 --- a/epclust/src/filter.cpp +++ b/epclust/src/filter.cpp @@ -1,51 +1,50 @@ #include -#include // Rprintf() -//#include // user interrupts -#include -#include - -#include - using namespace Rcpp; //' filter //' -//' Filter time-series +//' Filter [time-]series by replacing all values by the moving average of previous, current and +//' next value. Possible extensions: larger window, gaussian kernel... (but would be costly!). +//' Note: border values are unchanged. //' -//' @param cwt Continuous wavelets transform +//' @param cwt Continuous wavelets transform (in columns): a matrix of size LxD //' -//' @return The filtered CWT +//' @return The filtered CWT, in a matrix of same size (LxD) // [[Rcpp::export]] -RcppExport SEXP epclustFilter(SEXP cwt_) +RcppExport SEXP filterMA(SEXP cwt_) { + // NOTE: C-style for better efficiency (this must be as fast as possible) int L = INTEGER(Rf_getAttrib(cwt_, R_DimSymbol))[0], D = INTEGER(Rf_getAttrib(cwt_, R_DimSymbol))[1]; double *cwt = REAL(cwt_); - SEXP fcwt_; + + SEXP fcwt_; //the filtered result PROTECT(fcwt_ = Rf_allocMatrix(REALSXP, L, D)); - double* fcwt = REAL(fcwt_); //(double*)malloc(L*D*sizeof(double)); + double* fcwt = REAL(fcwt_); //pointer to the encapsulated vector - //TODO: coding style is terrible... no time for now. - for (int col=0; col=0; col--) { - double v1 = cwt[0]; - double ma = v1 + cwt[1] + cwt[2]; + double v1 = cwt[0]; //first value + double ms = v1 + cwt[1] + cwt[2]; //moving sum at second value for (int i=1; i