c_percentile.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include <math.h>
  2. #include <grass/gis.h>
  3. #include <grass/raster.h>
  4. #include <grass/stats.h>
  5. void c_quant(DCELL * result, DCELL * values, int n, const void *closure)
  6. {
  7. double quant = *(const double *)closure;
  8. double k;
  9. int i0, i1;
  10. n = sort_cell(values, n);
  11. if (n < 1) {
  12. Rast_set_d_null_value(result, 1);
  13. return;
  14. }
  15. /* algorithm type 7 of Hyndman and Fan (1996), default in R */
  16. k = quant * (n - 1);
  17. i0 = (int)floor(k);
  18. i1 = (int)ceil(k);
  19. *result = (i0 == i1)
  20. ? values[i0]
  21. : values[i0] * (i1 - k) + values[i1] * (k - i0);
  22. }
  23. void c_quart1(DCELL * result, DCELL * values, int n, const void *closure)
  24. {
  25. static const double q = 0.25;
  26. c_quant(result, values, n, &q);
  27. }
  28. void c_quart3(DCELL * result, DCELL * values, int n, const void *closure)
  29. {
  30. static const double q = 0.75;
  31. c_quant(result, values, n, &q);
  32. }
  33. void c_perc90(DCELL * result, DCELL * values, int n, const void *closure)
  34. {
  35. static const double q = 0.90;
  36. c_quant(result, values, n, &q);
  37. }
  38. void w_quant(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  39. {
  40. double quant = *(const double *)closure;
  41. DCELL total;
  42. int i;
  43. DCELL k;
  44. n = sort_cell_w(values, n);
  45. if (n < 1) {
  46. Rast_set_d_null_value(result, 1);
  47. return;
  48. }
  49. total = 0.0;
  50. for (i = 0; i < n; i++)
  51. total += values[i][1];
  52. k = 0.0;
  53. for (i = 0; i < n; i++) {
  54. k += values[i][1];
  55. if (k >= total * quant)
  56. break;
  57. }
  58. *result = values[i][0];
  59. }
  60. void w_quart1(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  61. {
  62. static const double q = 0.25;
  63. w_quant(result, values, n, &q);
  64. }
  65. void w_quart3(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  66. {
  67. static const double q = 0.75;
  68. w_quant(result, values, n, &q);
  69. }
  70. void w_perc90(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  71. {
  72. static const double q = 0.90;
  73. w_quant(result, values, n, &q);
  74. }