c_assign.c 812 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include <math.h>
  2. #include <grass/cluster.h>
  3. int I_cluster_assign(struct Cluster *C, int *interrupted)
  4. {
  5. int p, c;
  6. int class, band;
  7. double d, q;
  8. double dmin;
  9. /*
  10. fprintf (stderr,"I_cluster_assign(npoints=%d,nclasses=%d,nbands=%d)\n",
  11. C->npoints, C->nclasses, C->nbands);
  12. */
  13. for (p = 0; p < C->npoints; p++) {
  14. if (*interrupted)
  15. return -1;
  16. dmin = HUGE_VAL;
  17. class = 0;
  18. for (c = 0; c < C->nclasses; c++) {
  19. d = 0.0;
  20. for (band = 0; band < C->nbands; band++) {
  21. q = C->points[band][p];
  22. q -= C->mean[band][c];
  23. d += q * q;
  24. }
  25. if (c == 0 || d < dmin) {
  26. class = c;
  27. dmin = d;
  28. }
  29. }
  30. C->class[p] = class;
  31. C->count[class]++;
  32. for (band = 0; band < C->nbands; band++)
  33. C->sum[band][class] += C->points[band][p];
  34. }
  35. return 0;
  36. }