1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*!
- \file cluster/c_sig.c
-
- \brief Cluster library - Signatures
-
- (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 <grass/cluster.h>
- /*!
- \brief Create signatures
- \param C pointer to Cluster structure
- \return 0
- */
- int I_cluster_signatures(struct Cluster *C)
- {
- int c, p, band1, band2;
- int n;
- double m1, m2;
- double p1, p2;
- double dn;
- /*
- fprintf (stderr, "c_sig: 1\n");
- fprintf (stderr, " nclasses %d\n", C->nclasses);
- fprintf (stderr, " npoints %d\n", C->npoints );
- fprintf (stderr, " nbands %d\n", C->nbands );
- */
- for (n = 0; n < C->nclasses; n++) {
- I_new_signature(&C->S);
- }
- for (p = 0; p < C->npoints; p++) {
- c = C->class[p];
- if (c < 0)
- continue;
- /*
- if (c >= C->nclasses)
- fprintf (stderr, " class[%d]=%d ** illegal **\n", p, c);
- */
- dn = n = C->count[c];
- if (n < 2)
- continue;
- for (band1 = 0; band1 < C->nbands; band1++) {
- m1 = C->sum[band1][c] / dn;
- p1 = C->points[band1][p];
- for (band2 = 0; band2 <= band1; band2++) {
- m2 = C->sum[band2][c] / dn;
- p2 = C->points[band2][p];
- C->S.sig[c].var[band1][band2] += (p1 - m1) * (p2 - m2);
- }
- }
- }
- for (c = 0; c < C->nclasses; c++) {
- dn = n = C->S.sig[c].npoints = C->count[c];
- if (n == 0)
- dn = 1.0;
- for (band1 = 0; band1 < C->nbands; band1++)
- C->S.sig[c].mean[band1] = C->sum[band1][c] / dn;
- dn = n = C->count[c] - 1;
- if (n < 1)
- continue;
- for (band1 = 0; band1 < C->nbands; band1++)
- for (band2 = 0; band2 <= band1; band2++)
- C->S.sig[c].var[band1][band2] /= dn;
- C->S.sig[c].status = 1;
- }
- return 0;
- }
|