c_sig.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <grass/cluster.h>
  2. int I_cluster_signatures(struct Cluster *C)
  3. {
  4. int c, p, band1, band2;
  5. int n;
  6. double m1, m2;
  7. double p1, p2;
  8. double dn;
  9. /*
  10. fprintf (stderr, "c_sig: 1\n");
  11. fprintf (stderr, " nclasses %d\n", C->nclasses);
  12. fprintf (stderr, " npoints %d\n", C->npoints );
  13. fprintf (stderr, " nbands %d\n", C->nbands );
  14. */
  15. for (n = 0; n < C->nclasses; n++) {
  16. I_new_signature(&C->S);
  17. }
  18. for (p = 0; p < C->npoints; p++) {
  19. c = C->class[p];
  20. if (c < 0)
  21. continue;
  22. /*
  23. if (c >= C->nclasses)
  24. fprintf (stderr, " class[%d]=%d ** illegal **\n", p, c);
  25. */
  26. dn = n = C->count[c];
  27. if (n < 2)
  28. continue;
  29. for (band1 = 0; band1 < C->nbands; band1++) {
  30. m1 = C->sum[band1][c] / dn;
  31. p1 = C->points[band1][p];
  32. for (band2 = 0; band2 <= band1; band2++) {
  33. m2 = C->sum[band2][c] / dn;
  34. p2 = C->points[band2][p];
  35. C->S.sig[c].var[band1][band2] += (p1 - m1) * (p2 - m2);
  36. }
  37. }
  38. }
  39. for (c = 0; c < C->nclasses; c++) {
  40. dn = n = C->S.sig[c].npoints = C->count[c];
  41. if (n == 0)
  42. dn = 1.0;
  43. for (band1 = 0; band1 < C->nbands; band1++)
  44. C->S.sig[c].mean[band1] = C->sum[band1][c] / dn;
  45. dn = n = C->count[c] - 1;
  46. if (n < 1)
  47. continue;
  48. for (band1 = 0; band1 < C->nbands; band1++)
  49. for (band2 = 0; band2 <= band1; band2++)
  50. C->S.sig[c].var[band1][band2] /= dn;
  51. C->S.sig[c].status = 1;
  52. }
  53. return 0;
  54. }