c_kurt.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. sumqt = 0;
  23. for (i = 0; i < n; i++) {
  24. DCELL d;
  25. if (Rast_is_d_null_value(&values[i]))
  26. continue;
  27. d = values[i] - ave;
  28. sumsq += d * d;
  29. sumqt += d * d * d * d;
  30. }
  31. var = sumsq / count;
  32. *result = sumqt / (count * var * var) - 3;
  33. }
  34. void w_kurt(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  35. {
  36. DCELL sum, ave, sumsq, sumqt, var;
  37. DCELL count;
  38. int i;
  39. sum = 0.0;
  40. count = 0;
  41. for (i = 0; i < n; i++) {
  42. if (Rast_is_d_null_value(&values[i][0]))
  43. continue;
  44. sum += values[i][0] * values[i][1];
  45. count += values[i][1];
  46. }
  47. if (count == 0) {
  48. Rast_set_d_null_value(result, 1);
  49. return;
  50. }
  51. ave = sum / count;
  52. sumsq = 0;
  53. sumqt = 0;
  54. for (i = 0; i < n; i++) {
  55. DCELL d;
  56. if (Rast_is_d_null_value(&values[i][0]))
  57. continue;
  58. d = values[i][0] - ave;
  59. sumsq += d * d * values[i][1];
  60. sumqt += d * d * d * values[i][1];
  61. }
  62. var = sumsq / count;
  63. *result = sumqt / (count * var * var) - 3;
  64. }