GRASS GIS 8 Programmer's Manual 8.4.1(2025)-45ca3179ab
Loading...
Searching...
No Matches
c_percentile.c
Go to the documentation of this file.
1#include <math.h>
2
3#include <grass/gis.h>
4#include <grass/raster.h>
5#include <grass/stats.h>
6
7void c_quant(DCELL *result, DCELL *values, int n, const void *closure)
8{
9 double quant = *(const double *)closure;
10 double k;
11 int i0, i1;
12
13 n = sort_cell(values, n);
14
15 if (n < 1) {
16 Rast_set_d_null_value(result, 1);
17 return;
18 }
19
20 /* algorithm type 7 of Hyndman and Fan (1996), default in R */
21 k = quant * (n - 1);
22 i0 = (int)floor(k);
23 i1 = (int)ceil(k);
24
25 *result =
26 (i0 == i1) ? values[i0] : values[i0] * (i1 - k) + values[i1] * (k - i0);
27}
28
29void c_quart1(DCELL *result, DCELL *values, int n, const void *closure UNUSED)
30{
31 static const double q = 0.25;
32
33 c_quant(result, values, n, &q);
34}
35
36void c_quart3(DCELL *result, DCELL *values, int n, const void *closure UNUSED)
37{
38 static const double q = 0.75;
39
40 c_quant(result, values, n, &q);
41}
42
43void c_perc90(DCELL *result, DCELL *values, int n, const void *closure UNUSED)
44{
45 static const double q = 0.90;
46
47 c_quant(result, values, n, &q);
48}
49
50void w_quant(DCELL *result, DCELL (*values)[2], int n, const void *closure)
51{
52 double quant = *(const double *)closure;
53 DCELL total;
54 int i;
55 DCELL k;
56
57 n = sort_cell_w(values, n);
58
59 if (n < 1) {
60 Rast_set_d_null_value(result, 1);
61 return;
62 }
63
64 total = 0.0;
65 for (i = 0; i < n; i++)
66 total += values[i][1];
67
68 k = 0.0;
69 for (i = 0; i < n; i++) {
70 k += values[i][1];
71 if (k >= total * quant)
72 break;
73 }
74
75 *result = values[i][0];
76}
77
78void w_quart1(DCELL *result, DCELL (*values)[2], int n,
79 const void *closure UNUSED)
80{
81 static const double q = 0.25;
82
83 w_quant(result, values, n, &q);
84}
85
86void w_quart3(DCELL *result, DCELL (*values)[2], int n,
87 const void *closure UNUSED)
88{
89 static const double q = 0.75;
90
91 w_quant(result, values, n, &q);
92}
93
94void w_perc90(DCELL *result, DCELL (*values)[2], int n,
95 const void *closure UNUSED)
96{
97 static const double q = 0.90;
98
99 w_quant(result, values, n, &q);
100}
void w_quant(DCELL *result, DCELL(*values)[2], int n, const void *closure)
void w_perc90(DCELL *result, DCELL(*values)[2], int n, const void *closure UNUSED)
void c_quart3(DCELL *result, DCELL *values, int n, const void *closure UNUSED)
void w_quart1(DCELL *result, DCELL(*values)[2], int n, const void *closure UNUSED)
void c_quart1(DCELL *result, DCELL *values, int n, const void *closure UNUSED)
void w_quart3(DCELL *result, DCELL(*values)[2], int n, const void *closure UNUSED)
void c_quant(DCELL *result, DCELL *values, int n, const void *closure)
Definition c_percentile.c:7
void c_perc90(DCELL *result, DCELL *values, int n, const void *closure UNUSED)
int sort_cell(DCELL *array, int n)
Definition sort_cell.c:27
int sort_cell_w(DCELL(*array)[2], int n)
Definition sort_cell.c:46