c_percentile.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. k = n * quant;
  16. i0 = (int)floor(k);
  17. i1 = (int)ceil(k);
  18. *result = (i0 == i1)
  19. ? values[i0]
  20. : values[i0] * (i1 - k) + values[i1] * (k - i0);
  21. }
  22. void c_quart1(DCELL * result, DCELL * values, int n, const void *closure)
  23. {
  24. static const double q = 0.25;
  25. c_quant(result, values, n, &q);
  26. }
  27. void c_quart3(DCELL * result, DCELL * values, int n, const void *closure)
  28. {
  29. static const double q = 0.75;
  30. c_quant(result, values, n, &q);
  31. }
  32. void c_perc90(DCELL * result, DCELL * values, int n, const void *closure)
  33. {
  34. static const double q = 0.90;
  35. c_quant(result, values, n, &q);
  36. }
  37. void w_quant(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  38. {
  39. double quant = *(const double *)closure;
  40. DCELL total;
  41. int i;
  42. DCELL k;
  43. n = sort_cell_w(values, n);
  44. if (n < 1) {
  45. Rast_set_d_null_value(result, 1);
  46. return;
  47. }
  48. total = 0.0;
  49. for (i = 0; i < n; i++)
  50. total += values[i][1];
  51. k = 0.0;
  52. for (i = 0; i < n; i++) {
  53. k += values[i][1];
  54. if (k >= total * quant)
  55. break;
  56. }
  57. *result = values[i][0];
  58. }
  59. void w_quart1(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  60. {
  61. static const double q = 0.25;
  62. w_quant(result, values, n, &q);
  63. }
  64. void w_quart3(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  65. {
  66. static const double q = 0.75;
  67. w_quant(result, values, n, &q);
  68. }
  69. void w_perc90(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  70. {
  71. static const double q = 0.90;
  72. w_quant(result, values, n, &q);
  73. }