123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /*!
- \file cluster/c_sep.c
-
- \brief Cluster library - Separation
-
- (C) 2001-2009 by the GRASS Development Team
-
- This program is free software under the GNU General Public License
- (>=v2). Read the file COPYING that comes with GRASS for details.
-
- \author Original author CERL
- */
- #include <math.h>
- #include <grass/cluster.h>
- #define FAR ((double) -1.0)
- /*!
- \brief ?
- \param C pointer to Cluster structure
- \param class1 1st class
- \param class2 2nd class
- */
- double I_cluster_separation(struct Cluster *C, int class1, int class2)
- {
- int band;
- double q;
- double d;
- double var;
- double a1, a2;
- double n1, n2;
- double m1, m2;
- double s1, s2;
- if (C->count[class1] < 2)
- return FAR;
- if (C->count[class2] < 2)
- return FAR;
- n1 = (double)C->count[class1];
- n2 = (double)C->count[class2];
- d = 0.0;
- a1 = a2 = 0.0;
- for (band = 0; band < C->nbands; band++) {
- s1 = C->sum[band][class1];
- s2 = C->sum[band][class2];
- m1 = s1 / n1;
- m2 = s2 / n2;
- q = m1 - m2;
- q = q * q;
- d += q;
- var = C->sum2[band][class1] - (s1 * m1);
- var /= n1 - 1;
- if (var)
- a1 += q / var;
- var = C->sum2[band][class2] - (s2 * m2);
- var /= n2 - 1;
- if (var)
- a2 += q / var;
- }
- if (d == 0.0)
- return d;
- if (a1 < 0 || a2 < 0)
- return FAR;
- if (a1)
- a1 = sqrt(6 * d / a1);
- if (a2)
- a2 = sqrt(6 * d / a2);
- q = a1 + a2;
- if (q == 0.0)
- return FAR;
- return (sqrt(d) / q);
- }
|