|
@@ -2,8 +2,9 @@
|
|
|
#include <grass/gis.h>
|
|
|
#include <grass/stats.h>
|
|
|
|
|
|
-static void percentile(DCELL * result, DCELL * values, int n, double percent)
|
|
|
+void c_quant(DCELL * result, DCELL * values, int n, const void *closure)
|
|
|
{
|
|
|
+ double quant = *(const double *)closure;
|
|
|
double k;
|
|
|
int i0, i1;
|
|
|
|
|
@@ -14,7 +15,7 @@ static void percentile(DCELL * result, DCELL * values, int n, double percent)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- k = n * percent / 100;
|
|
|
+ k = n * quant;
|
|
|
i0 = (int)floor(k);
|
|
|
i1 = (int)ceil(k);
|
|
|
|
|
@@ -23,24 +24,27 @@ static void percentile(DCELL * result, DCELL * values, int n, double percent)
|
|
|
: values[i0] * (i1 - k) + values[i1] * (k - i0);
|
|
|
}
|
|
|
|
|
|
-void c_quart1(DCELL * result, DCELL * values, int n)
|
|
|
+void c_quart1(DCELL * result, DCELL * values, int n, const void *closure)
|
|
|
{
|
|
|
- percentile(result, values, n, 25.0);
|
|
|
+ static const double q = 0.25;
|
|
|
+ c_quant(result, values, n, &q);
|
|
|
}
|
|
|
|
|
|
-void c_quart3(DCELL * result, DCELL * values, int n)
|
|
|
+void c_quart3(DCELL * result, DCELL * values, int n, const void *closure)
|
|
|
{
|
|
|
- percentile(result, values, n, 75.0);
|
|
|
+ static const double q = 0.75;
|
|
|
+ c_quant(result, values, n, &q);
|
|
|
}
|
|
|
|
|
|
-void c_perc90(DCELL * result, DCELL * values, int n)
|
|
|
+void c_perc90(DCELL * result, DCELL * values, int n, const void *closure)
|
|
|
{
|
|
|
- percentile(result, values, n, 90.0);
|
|
|
+ static const double q = 0.90;
|
|
|
+ c_quant(result, values, n, &q);
|
|
|
}
|
|
|
|
|
|
-static void percentile_w(DCELL * result, DCELL(*values)[2], int n,
|
|
|
- double percent)
|
|
|
+void w_quant(DCELL * result, DCELL(*values)[2], int n, const void *closure)
|
|
|
{
|
|
|
+ double quant = *(const double *)closure;
|
|
|
DCELL total;
|
|
|
int i;
|
|
|
DCELL k;
|
|
@@ -59,24 +63,27 @@ static void percentile_w(DCELL * result, DCELL(*values)[2], int n,
|
|
|
k = 0.0;
|
|
|
for (i = 0; i < n; i++) {
|
|
|
k += values[i][1];
|
|
|
- if (k >= total * percent / 100)
|
|
|
+ if (k >= total * quant)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
*result = values[i][0];
|
|
|
}
|
|
|
|
|
|
-void w_quart1(DCELL * result, DCELL(*values)[2], int n)
|
|
|
+void w_quart1(DCELL * result, DCELL(*values)[2], int n, const void *closure)
|
|
|
{
|
|
|
- percentile_w(result, values, n, 25.0);
|
|
|
+ static const double q = 0.25;
|
|
|
+ w_quant(result, values, n, &q);
|
|
|
}
|
|
|
|
|
|
-void w_quart3(DCELL * result, DCELL(*values)[2], int n)
|
|
|
+void w_quart3(DCELL * result, DCELL(*values)[2], int n, const void *closure)
|
|
|
{
|
|
|
- percentile_w(result, values, n, 75.0);
|
|
|
+ static const double q = 0.75;
|
|
|
+ w_quant(result, values, n, &q);
|
|
|
}
|
|
|
|
|
|
-void w_perc90(DCELL * result, DCELL(*values)[2], int n)
|
|
|
+void w_perc90(DCELL * result, DCELL(*values)[2], int n, const void *closure)
|
|
|
{
|
|
|
- percentile_w(result, values, n, 90.0);
|
|
|
+ static const double q = 0.90;
|
|
|
+ w_quant(result, values, n, &q);
|
|
|
}
|