|
Packit |
67cb25 |
#include <stdio.h>
|
|
Packit |
67cb25 |
#include <stdlib.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_rstat.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_statistics.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_rng.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_randist.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_sort.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
main(void)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const size_t N = 10000;
|
|
Packit |
67cb25 |
double *data = malloc(N * sizeof(double));
|
|
Packit |
67cb25 |
gsl_rstat_quantile_workspace *work_25 = gsl_rstat_quantile_alloc(0.25);
|
|
Packit |
67cb25 |
gsl_rstat_quantile_workspace *work_50 = gsl_rstat_quantile_alloc(0.5);
|
|
Packit |
67cb25 |
gsl_rstat_quantile_workspace *work_75 = gsl_rstat_quantile_alloc(0.75);
|
|
Packit |
67cb25 |
gsl_rng *r = gsl_rng_alloc(gsl_rng_default);
|
|
Packit |
67cb25 |
double exact_p25, exact_p50, exact_p75;
|
|
Packit |
67cb25 |
double val_p25, val_p50, val_p75;
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* add data to quantile accumulators; also store data for exact
|
|
Packit |
67cb25 |
* comparisons */
|
|
Packit |
67cb25 |
for (i = 0; i < N; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
data[i] = gsl_ran_rayleigh(r, 1.0);
|
|
Packit |
67cb25 |
gsl_rstat_quantile_add(data[i], work_25);
|
|
Packit |
67cb25 |
gsl_rstat_quantile_add(data[i], work_50);
|
|
Packit |
67cb25 |
gsl_rstat_quantile_add(data[i], work_75);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* exact values */
|
|
Packit |
67cb25 |
gsl_sort(data, 1, N);
|
|
Packit |
67cb25 |
exact_p25 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.25);
|
|
Packit |
67cb25 |
exact_p50 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.5);
|
|
Packit |
67cb25 |
exact_p75 = gsl_stats_quantile_from_sorted_data(data, 1, N, 0.75);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* estimated values */
|
|
Packit |
67cb25 |
val_p25 = gsl_rstat_quantile_get(work_25);
|
|
Packit |
67cb25 |
val_p50 = gsl_rstat_quantile_get(work_50);
|
|
Packit |
67cb25 |
val_p75 = gsl_rstat_quantile_get(work_75);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
printf ("The dataset is %g, %g, %g, %g, %g, ...\n",
|
|
Packit |
67cb25 |
data[0], data[1], data[2], data[3], data[4]);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
printf ("0.25 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n",
|
|
Packit |
67cb25 |
exact_p25, val_p25, (val_p25 - exact_p25) / exact_p25);
|
|
Packit |
67cb25 |
printf ("0.50 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n",
|
|
Packit |
67cb25 |
exact_p50, val_p50, (val_p50 - exact_p50) / exact_p50);
|
|
Packit |
67cb25 |
printf ("0.75 quartile: exact = %.5f, estimated = %.5f, error = %.6e\n",
|
|
Packit |
67cb25 |
exact_p75, val_p75, (val_p75 - exact_p75) / exact_p75);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_rstat_quantile_free(work_25);
|
|
Packit |
67cb25 |
gsl_rstat_quantile_free(work_50);
|
|
Packit |
67cb25 |
gsl_rstat_quantile_free(work_75);
|
|
Packit |
67cb25 |
gsl_rng_free(r);
|
|
Packit |
67cb25 |
free(data);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return 0;
|
|
Packit |
67cb25 |
}
|