5 #include <grass/raster.h>
6 #include <grass/raster.h>
7 #include <grass/calc.h>
14 #define SIZE_THRESHOLD 32
16 static int icmp(
const void *aa,
const void *bb)
24 static int fcmp(
const void *aa,
const void *bb)
36 static int dcmp(
const void *aa,
const void *bb)
48 int f_nmedian(
int argc,
const int *argt,
void **args)
50 int size = argc * Rast_cell_size(argt[0]);
52 bool use_heap =
false;
57 for (i = 1; i <= argc; i++)
58 if (argt[i] != argt[0])
64 CELL *a = stack_array;
72 CELL **argv = (CELL **)&args[1];
79 for (j = 0; j < argc; j++) {
80 if (IS_NULL_C(&argv[j][i]))
90 qsort(a, n,
sizeof(CELL), icmp);
95 *resc = (*resc + a1) / 2;
108 FCELL *a = stack_array;
115 FCELL *res = args[0];
116 FCELL **argv = (FCELL **)&args[1];
120 for (i = 0; i <
columns; i++) {
123 for (j = 0; j < argc; j++) {
124 if (IS_NULL_F(&argv[j][i]))
134 qsort(a, n,
sizeof(FCELL), fcmp);
139 *resc = (*resc + a1) / 2;
152 DCELL *a = stack_array;
159 DCELL *res = args[0];
160 DCELL **argv = (DCELL **)&args[1];
164 for (i = 0; i <
columns; i++) {
167 for (j = 0; j < argc; j++) {
168 if (IS_NULL_D(&argv[j][i]))
178 qsort(a, n,
sizeof(DCELL), dcmp);
183 *resc = (*resc + a1) / 2;
void G_free(void *buf)
Free allocated memory.