1 /*! 2 \file cluster/c_begin.c 3 4 \brief Cluster library - Begin clusterring 5 6 (C) 2001-2009 by the GRASS Development Team 7 8 This program is free software under the GNU General Public License 9 (>=v2). Read the file COPYING that comes with GRASS for details. 10 11 \author Original author CERL 12 */ 13 14 #include <stdlib.h> 15 #include <grass/glocale.h> 16 #include <grass/cluster.h> 17 18 /*! 19 \brief Initialize the cluster routines for nbands 20 21 \param C pointer to Cluster structure 22 \param nbands number of bands 23 24 \return 0 ok 25 \return -1 out of memory 26 \return 1 illegal number of bands 27 */ I_cluster_begin(struct Cluster * C,int nbands)28int I_cluster_begin(struct Cluster *C, int nbands) 29 { 30 int band; 31 32 if (C->points != NULL) { 33 for (band = 0; band < C->nbands; band++) 34 if (C->points[band] != NULL) 35 free(C->points[band]); 36 free(C->points); 37 } 38 if (C->band_sum != NULL) 39 free(C->band_sum); 40 if (C->band_sum2 != NULL) 41 free(C->band_sum2); 42 43 C->points = NULL; 44 C->band_sum = NULL; 45 C->band_sum2 = NULL; 46 47 I_free_signatures(&C->S); 48 49 /* record the number of bands */ 50 C->nbands = nbands; 51 if (nbands <= 0) 52 return 1; 53 54 /* prepare the signatures for nbands */ 55 56 I_init_signatures(&C->S, nbands); 57 sprintf(C->S.title, _("produced by i.cluster")); 58 59 /* allocate the data (points) arrays */ 60 C->points = (DCELL **) malloc(C->nbands * sizeof(DCELL *)); 61 if (C->points == NULL) 62 return -1; 63 for (band = 0; band < C->nbands; band++) 64 C->points[band] = NULL; 65 66 C->np = 128; 67 for (band = 0; band < C->nbands; band++) { 68 C->points[band] = (DCELL *) malloc(C->np * sizeof(DCELL)); 69 if (C->points[band] == NULL) 70 return -1; 71 } 72 73 /* initialize the count to zero */ 74 C->npoints = 0; 75 76 /* allocate the band sums and means */ 77 C->band_sum = (double *)malloc(C->nbands * sizeof(double)); 78 if (C->band_sum == NULL) 79 return -1; 80 C->band_sum2 = (double *)malloc(C->nbands * sizeof(double)); 81 if (C->band_sum2 == NULL) 82 return -1; 83 for (band = 0; band < C->nbands; band++) { 84 C->band_sum[band] = 0; 85 C->band_sum2[band] = 0; 86 } 87 88 return 0; 89 } 90