Blame doc/examples/movstat3.c

Packit 67cb25
#include <stdio.h>
Packit 67cb25
#include <stdlib.h>
Packit 67cb25
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
#include <gsl/gsl_movstat.h>
Packit 67cb25
#include <gsl/gsl_rng.h>
Packit 67cb25
#include <gsl/gsl_randist.h>
Packit 67cb25
#include <gsl/gsl_vector.h>
Packit 67cb25
#include <gsl/gsl_sort.h>
Packit 67cb25
#include <gsl/gsl_statistics.h>
Packit 67cb25
Packit 67cb25
double
Packit 67cb25
func(const size_t n, double x[], void * params)
Packit 67cb25
{
Packit 67cb25
  const double alpha = *(double *) params;
Packit 67cb25
Packit 67cb25
  gsl_sort(x, 1, n);
Packit 67cb25
Packit 67cb25
  return gsl_stats_trmean_from_sorted_data(alpha, x, 1, n);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
main(void)
Packit 67cb25
{
Packit 67cb25
  const size_t N = 1000;                /* length of time series */
Packit 67cb25
  const size_t K = 11;                  /* window size */
Packit 67cb25
  double alpha = 0.1;                   /* trimmed mean parameter */
Packit 67cb25
  gsl_vector *x = gsl_vector_alloc(N);  /* input vector */
Packit 67cb25
  gsl_vector *y = gsl_vector_alloc(N);  /* filtered output vector for alpha1 */
Packit 67cb25
  gsl_rng *r = gsl_rng_alloc(gsl_rng_default);
Packit 67cb25
  gsl_movstat_workspace *w = gsl_movstat_alloc(K);
Packit 67cb25
  gsl_movstat_function F;
Packit 67cb25
  size_t i;
Packit 67cb25
  double sum = 0.0;
Packit 67cb25
Packit 67cb25
  /* generate input signal */
Packit 67cb25
  for (i = 0; i < N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double ui = gsl_ran_gaussian(r, 1.0);
Packit 67cb25
      double outlier = (gsl_rng_uniform(r) < 0.01) ? 10.0*GSL_SIGN(ui) : 0.0;
Packit 67cb25
      sum += ui;
Packit 67cb25
      gsl_vector_set(x, i, sum + outlier);
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  /* apply moving window function */
Packit 67cb25
  F.function = func;
Packit 67cb25
  F.params = α
Packit 67cb25
  gsl_movstat_apply(GSL_MOVSTAT_END_PADVALUE, &F, x, y, w);
Packit 67cb25
Packit 67cb25
  /* print results */
Packit 67cb25
  for (i = 0; i < N; ++i)
Packit 67cb25
    {
Packit 67cb25
      double xi = gsl_vector_get(x, i);
Packit 67cb25
      double yi = gsl_vector_get(y, i);
Packit 67cb25
Packit 67cb25
      printf("%f %f\n", xi, yi);
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  gsl_vector_free(x);
Packit 67cb25
  gsl_vector_free(y);
Packit 67cb25
  gsl_rng_free(r);
Packit 67cb25
  gsl_movstat_free(w);
Packit 67cb25
Packit 67cb25
  return 0;
Packit 67cb25
}