c_kurt.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <grass/gis.h>
  2. #include <grass/raster.h>
  3. void c_kurt(DCELL * result, DCELL * values, int n, const void *closure)
  4. {
  5. DCELL sum, ave, sumsq, sumqt, var;
  6. int count;
  7. int i;
  8. sum = 0.0;
  9. count = 0;
  10. for (i = 0; i < n; i++) {
  11. if (Rast_is_d_null_value(&values[i]))
  12. continue;
  13. sum += values[i];
  14. count++;
  15. }
  16. if (count == 0) {
  17. Rast_set_d_null_value(result, 1);
  18. return;
  19. }
  20. ave = sum / count;
  21. sumsq = 0;
  22. for (i = 0; i < n; i++) {
  23. DCELL d;
  24. if (Rast_is_d_null_value(&values[i]))
  25. continue;
  26. d = values[i] - ave;
  27. sumsq += d * d;
  28. sumqt += d * d * d * d;
  29. }
  30. var = sumsq / count;
  31. *result = sumqt / (count * var * var) - 3;
  32. }
  33. void w_kurt(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  34. {
  35. DCELL sum, ave, sumsq, sumqt, var;
  36. int count;
  37. int i;
  38. sum = 0.0;
  39. count = 0;
  40. for (i = 0; i < n; i++) {
  41. if (Rast_is_d_null_value(&values[i][0]))
  42. continue;
  43. sum += values[i][0] * values[i][1];
  44. count += values[i][1];
  45. }
  46. if (count == 0) {
  47. Rast_set_d_null_value(result, 1);
  48. return;
  49. }
  50. ave = sum / count;
  51. sumsq = 0;
  52. for (i = 0; i < n; i++) {
  53. DCELL d;
  54. if (Rast_is_d_null_value(&values[i][0]))
  55. continue;
  56. d = values[i][0] - ave;
  57. sumsq += d * d * values[i][1];
  58. sumqt += d * d * d * values[i][1];
  59. }
  60. var = sumsq / count;
  61. *result = sumqt / (count * var * var) - 3;
  62. }