GRASS Programmer's Manual  6.4.2(2012)
c_percentile.c
Go to the documentation of this file.
00001 #include <math.h>
00002 
00003 #include <grass/gis.h>
00004 #include <grass/stats.h>
00005 
00006 void c_quant(DCELL * result, DCELL * values, int n, const void *closure)
00007 {
00008     double quant = *(const double *)closure;
00009     double k;
00010     int i0, i1;
00011 
00012     n = sort_cell(values, n);
00013 
00014     if (n < 1) {
00015         G_set_d_null_value(result, 1);
00016         return;
00017     }
00018 
00019     k = n * quant;
00020     i0 = (int)floor(k);
00021     i1 = (int)ceil(k);
00022 
00023     *result = (i0 == i1)
00024         ? values[i0]
00025         : values[i0] * (i1 - k) + values[i1] * (k - i0);
00026 }
00027 
00028 void c_quart1(DCELL * result, DCELL * values, int n, const void *closure)
00029 {
00030     static const double q = 0.25;
00031     c_quant(result, values, n, &q);
00032 }
00033 
00034 void c_quart3(DCELL * result, DCELL * values, int n, const void *closure)
00035 {
00036     static const double q = 0.75;
00037     c_quant(result, values, n, &q);
00038 }
00039 
00040 void c_perc90(DCELL * result, DCELL * values, int n, const void *closure)
00041 {
00042     static const double q = 0.90;
00043     c_quant(result, values, n, &q);
00044 }
00045 
00046 void w_quant(DCELL * result, DCELL(*values)[2], int n, const void *closure)
00047 {
00048     double quant = *(const double *)closure;
00049     DCELL total;
00050     int i;
00051     DCELL k;
00052 
00053     n = sort_cell_w(values, n);
00054 
00055     if (n < 1) {
00056         G_set_d_null_value(result, 1);
00057         return;
00058     }
00059 
00060     total = 0.0;
00061     for (i = 0; i < n; i++)
00062         total += values[i][1];
00063 
00064     k = 0.0;
00065     for (i = 0; i < n; i++) {
00066         k += values[i][1];
00067         if (k >= total * quant)
00068             break;
00069     }
00070 
00071     *result = values[i][0];
00072 }
00073 
00074 void w_quart1(DCELL * result, DCELL(*values)[2], int n, const void *closure)
00075 {
00076     static const double q = 0.25;
00077     w_quant(result, values, n, &q);
00078 }
00079 
00080 void w_quart3(DCELL * result, DCELL(*values)[2], int n, const void *closure)
00081 {
00082     static const double q = 0.75;
00083     w_quant(result, values, n, &q);
00084 }
00085 
00086 void w_perc90(DCELL * result, DCELL(*values)[2], int n, const void *closure)
00087 {
00088     static const double q = 0.90;
00089     w_quant(result, values, n, &q);
00090 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines