5 #include <grass/raster.h>
6 #include <grass/calc.h>
13 #define SIZE_THRESHOLD 32
15 static int icmp(
const void *aa,
const void *bb)
23 static int fcmp(
const void *aa,
const void *bb)
35 static int dcmp(
const void *aa,
const void *bb)
47 int f_median(
int argc,
const int *argt,
void **args)
49 int size = argc * Rast_cell_size(argt[0]);
51 bool use_heap =
false;
56 for (i = 1; i <= argc; i++)
57 if (argt[i] != argt[0])
63 CELL *a = stack_array;
71 CELL **argv = (CELL **)&args[1];
72 CELL *a1 = &a[(argc - 1) / 2];
73 CELL *a2 = &a[argc / 2];
78 for (j = 0; j < argc && !nv; j++) {
79 if (IS_NULL_C(&argv[j][i]))
88 qsort(a, argc,
sizeof(CELL), icmp);
89 res[i] = (*a1 + *a2) / 2;
100 FCELL *a = stack_array;
107 FCELL *res = args[0];
108 FCELL **argv = (FCELL **)&args[1];
109 FCELL *a1 = &a[(argc - 1) / 2];
110 FCELL *a2 = &a[argc / 2];
112 for (i = 0; i <
columns; i++) {
115 for (j = 0; j < argc && !nv; j++) {
116 if (IS_NULL_F(&argv[j][i]))
125 qsort(a, argc,
sizeof(FCELL), fcmp);
126 res[i] = (*a1 + *a2) / 2;
137 DCELL *a = stack_array;
144 DCELL *res = args[0];
145 DCELL **argv = (DCELL **)&args[1];
146 DCELL *a1 = &a[(argc - 1) / 2];
147 DCELL *a2 = &a[argc / 2];
149 for (i = 0; i <
columns; i++) {
152 for (j = 0; j < argc && !nv; j++) {
153 if (IS_NULL_D(&argv[j][i]))
162 qsort(a, argc,
sizeof(DCELL), dcmp);
163 res[i] = (*a1 + *a2) / 2;
void G_free(void *buf)
Free allocated memory.