c_var.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <grass/gis.h>
  2. #include <grass/raster.h>
  3. void c_var(DCELL * result, DCELL * values, int n, const void *closure)
  4. {
  5. DCELL sum, ave, sumsq;
  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. }
  29. *result = sumsq / count;
  30. }
  31. void w_var(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  32. {
  33. DCELL sum, ave, sumsq;
  34. int count;
  35. int i;
  36. sum = 0.0;
  37. count = 0;
  38. for (i = 0; i < n; i++) {
  39. if (Rast_is_d_null_value(&values[i][0]))
  40. continue;
  41. sum += values[i][0] * values[i][1];
  42. count += values[i][1];
  43. }
  44. if (count == 0) {
  45. Rast_set_d_null_value(result, 1);
  46. return;
  47. }
  48. ave = sum / count;
  49. sumsq = 0;
  50. for (i = 0; i < n; i++) {
  51. DCELL d;
  52. if (Rast_is_d_null_value(&values[i][0]))
  53. continue;
  54. d = values[i][0] - ave;
  55. sumsq += d * d * values[i][1];
  56. }
  57. *result = sumsq / count;
  58. }