c_skew.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <math.h>
  2. #include <grass/gis.h>
  3. #include <grass/raster.h>
  4. void c_skew(DCELL * result, DCELL * values, int n, const void *closure)
  5. {
  6. DCELL sum, ave, sumsq, sumcb, sdev;
  7. int count;
  8. int i;
  9. sum = 0.0;
  10. count = 0;
  11. for (i = 0; i < n; i++) {
  12. if (Rast_is_d_null_value(&values[i]))
  13. continue;
  14. sum += values[i];
  15. count++;
  16. }
  17. if (count == 0) {
  18. Rast_set_d_null_value(result, 1);
  19. return;
  20. }
  21. ave = sum / count;
  22. sumsq = 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. sumcb += d * d * d;
  30. }
  31. sdev = sqrt(sumsq / count);
  32. *result = sumcb / (count * sdev * sdev * sdev);
  33. }
  34. void w_skew(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  35. {
  36. DCELL sum, ave, sumsq, sumcb, sdev;
  37. int 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. for (i = 0; i < n; i++) {
  54. DCELL d;
  55. if (Rast_is_d_null_value(&values[i][0]))
  56. continue;
  57. d = values[i][0] - ave;
  58. sumsq += d * d * values[i][1];
  59. sumcb += d * d * d * values[i][1];
  60. }
  61. sdev = sqrt(sumsq / count);
  62. *result = sumcb / (count * sdev * sdev * sdev);
  63. }