5 #include <grass/raster.h> 6 #include <grass/raster.h> 7 #include <grass/calc.h> 14 static int icmp(
const void *aa,
const void *bb)
22 static int fcmp(
const void *aa,
const void *bb)
34 static int dcmp(
const void *aa,
const void *bb)
46 int f_nmedian(
int argc,
const int *argt,
void **args)
50 int size = argc * Rast_cell_size(argt[0]);
56 for (i = 1; i <= argc; i++)
57 if (argt[i] != argt[0])
62 array = G_realloc(array, size);
69 CELL **argv = (CELL **) &args[1];
71 CELL *a1 = &a[(argc - 1) / 2];
72 CELL *a2 = &a[argc / 2];
77 for (j = 0; j < argc; j++) {
78 if (IS_NULL_C(&argv[j][i]))
86 qsort(a, n,
sizeof(CELL), icmp);
87 res[i] = (*a1 + *a2) / 2;
96 FCELL **argv = (FCELL **) &args[1];
98 FCELL *a1 = &a[(argc - 1) / 2];
99 FCELL *a2 = &a[argc / 2];
101 for (i = 0; i <
columns; i++) {
104 for (j = 0; j < argc; j++) {
105 if (IS_NULL_F(&argv[j][i]))
113 qsort(a, n,
sizeof(FCELL), fcmp);
114 res[i] = (*a1 + *a2) / 2;
122 DCELL *res = args[0];
123 DCELL **argv = (DCELL **) &args[1];
125 DCELL *a1 = &a[(argc - 1) / 2];
126 DCELL *a2 = &a[argc / 2];
128 for (i = 0; i <
columns; i++) {
131 for (j = 0; j < argc; j++) {
132 if (IS_NULL_D(&argv[j][i]))
140 qsort(a, n,
sizeof(DCELL), dcmp);
141 res[i] = (*a1 + *a2) / 2;