c_sep.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <math.h>
  2. #include <grass/cluster.h>
  3. #define FAR ((double) -1.0)
  4. double I_cluster_separation(struct Cluster *C, int class1, int class2)
  5. {
  6. int band;
  7. double q;
  8. double d;
  9. double var;
  10. double a1, a2;
  11. double n1, n2;
  12. double m1, m2;
  13. double s1, s2;
  14. if (C->count[class1] < 2)
  15. return FAR;
  16. if (C->count[class2] < 2)
  17. return FAR;
  18. n1 = (double)C->count[class1];
  19. n2 = (double)C->count[class2];
  20. d = 0.0;
  21. a1 = a2 = 0.0;
  22. for (band = 0; band < C->nbands; band++) {
  23. s1 = C->sum[band][class1];
  24. s2 = C->sum[band][class2];
  25. m1 = s1 / n1;
  26. m2 = s2 / n2;
  27. q = m1 - m2;
  28. q = q * q;
  29. d += q;
  30. var = C->sum2[band][class1] - (s1 * m1);
  31. var /= n1 - 1;
  32. if (var)
  33. a1 += q / var;
  34. var = C->sum2[band][class2] - (s2 * m2);
  35. var /= n2 - 1;
  36. if (var)
  37. a2 += q / var;
  38. }
  39. if (d == 0.0)
  40. return d;
  41. if (a1 < 0 || a2 < 0)
  42. return FAR;
  43. if (a1)
  44. a1 = sqrt(6 * d / a1);
  45. if (a2)
  46. a2 = sqrt(6 * d / a2);
  47. q = a1 + a2;
  48. if (q == 0.0)
  49. return FAR;
  50. return (sqrt(d) / q);
  51. }