c_skew.c 1.5 KB

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