int main(void) { int i; const int nrows = 13; const int ncols = 4; double** data = malloc(nrows*sizeof(double*) ); int** mask = malloc(nrows*sizeof(int*)); double** distmatrix; for (i = 0; i < nrows; i++) { data[i] = malloc(ncols*sizeof(double)); mask[i] = malloc(ncols*sizeof(int)); } /* Test data, roughly distributed in 0-5, 6-8, 9-12 */ data[ 0][ 0]=0.1; data[ 0][ 1]=0.0; data[ 0][ 2]=9.6; data[ 0][ 3] = 5.6; data[ 1][ 0]=1.4; data[ 1][ 1]=1.3; data[ 1][ 2]=0.0; data[ 1][ 3] = 3.8; data[ 2][ 0]=1.2; data[ 2][ 1]=2.5; data[ 2][ 2]=0.0; data[ 2][ 3] = 4.8; data[ 3][ 0]=2.3; data[ 3][ 1]=1.5; data[ 3][ 2]=9.2; data[ 3][ 3] = 4.3; data[ 4][ 0]=1.7; data[ 4][ 1]=0.7; data[ 4][ 2]=9.6; data[ 4][ 3] = 3.4; data[ 5][ 0]=0.0; data[ 5][ 1]=3.9; data[ 5][ 2]=9.8; data[ 5][ 3] = 5.1; data[ 6][ 0]=6.7; data[ 6][ 1]=3.9; data[ 6][ 2]=5.5; data[ 6][ 3] = 4.8; data[ 7][ 0]=0.0; data[ 7][ 1]=6.3; data[ 7][ 2]=5.7; data[ 7][ 3] = 4.3; data[ 8][ 0]=5.7; data[ 8][ 1]=6.9; data[ 8][ 2]=5.6; data[ 8][ 3] = 4.3; data[ 9][ 0]=0.0; data[ 9][ 1]=2.2; data[ 9][ 2]=5.4; data[ 9][ 3] = 0.0; data[10][ 0]=3.8; data[10][ 1]=3.5; data[10][ 2]=5.5; data[10][ 3] = 9.6; data[11][ 0]=0.0; data[11][ 1]=2.3; data[11][ 2]=3.6; data[11][ 3] = 8.5; data[12][ 0]=4.1; data[12][ 1]=4.5; data[12][ 2]=5.8; data[12][ 3] = 7.6; /* Some data are actually missing */ mask[ 0][ 0]=1; mask[ 0][ 1]=1; mask[ 0][ 2]=1; mask[ 0][ 3] = 1; mask[ 1][ 0]=1; mask[ 1][ 1]=1; mask[ 1][ 2]=0; mask[ 1][ 3] = 1; mask[ 2][ 0]=1; mask[ 2][ 1]=1; mask[ 2][ 2]=0; mask[ 2][ 3] = 1; mask[ 3][ 0]=1; mask[ 3][ 1]=1; mask[ 3][ 2]=1; mask[ 3][ 3] = 1; mask[ 4][ 0]=1; mask[ 4][ 1]=1; mask[ 4][ 2]=1; mask[ 4][ 3] = 1; mask[ 5][ 0]=0; mask[ 5][ 1]=1; mask[ 5][ 2]=1; mask[ 5][ 3] = 1; mask[ 6][ 0]=1; mask[ 6][ 1]=1; mask[ 6][ 2]=1; mask[ 6][ 3] = 1; mask[ 7][ 0]=0; mask[ 7][ 1]=1; mask[ 7][ 2]=1; mask[ 7][ 3] = 1; mask[ 8][ 0]=1; mask[ 8][ 1]=1; mask[ 8][ 2]=1; mask[ 8][ 3] = 1; mask[ 9][ 0]=1; mask[ 9][ 1]=1; mask[ 9][ 2]=1; mask[ 9][ 3] = 0; mask[10][ 0]=1; mask[10][ 1]=1; mask[10][ 2]=1; mask[10][ 3] = 1; mask[11][ 0]=0; mask[11][ 1]=1; mask[11][ 2]=1; mask[11][ 3] = 1; mask[12][ 0]=1; mask[12][ 1]=1; mask[12][ 2]=1; mask[12][ 3] = 1; show_data(nrows, ncols, data, mask); example_mean_median(nrows, ncols, data, mask); distmatrix = example_distance_gene(nrows, ncols, data, mask); if (distmatrix) example_hierarchical(nrows, ncols, data, mask, distmatrix); example_distance_array(nrows, ncols, data, mask); example_kmeans(nrows, ncols, data, mask); example_som(nrows, ncols, data, mask); return 0; }
/*! Put some help like for function thd_polyfit */ int thd_Acluster ( THD_3dim_dataset *in_set, byte *mask, int nmask, THD_3dim_dataset **clust_set, THD_3dim_dataset **dist_set, OPT_KMEANS oc ) { int ii, nl, nc; double **D=NULL, **distmatrix=NULL; /* this double business is a waste of memory, at least for D..*/ int ncol = -1; float *dvec=NULL; int* clusterid = NULL; short *sc = NULL; ENTRY("thd_Acluster"); if (!clust_set || *clust_set) { fprintf(stderr, "ERROR: output volume pointer pointers must point to NULL\n"); RETURN(0); } if (!mask) nmask = DSET_NVOX(in_set); ncol = DSET_NVALS(in_set); if (ncol < DSET_NUM_TIMES(in_set)) ncol = DSET_NUM_TIMES(in_set); if (oc.verb) { ININFO_message("Have %d/%d voxels to process " "with %d dimensions per voxel.\n", nmask, DSET_NVOX(in_set), ncol); } /* Create data matrix */ D = (double **)calloc(sizeof(double*), nmask); for (ii=0;ii<(nmask);++ii) { if (!(D[ii] = (double *)calloc(sizeof(double), ncol))) { fprintf(stderr,"ERROR: Failed while allocating %dx%d double matrix\n", nmask, ncol); RETURN(0); } } dvec = (float * )malloc(sizeof(float)*ncol) ; /* array to hold series */ if (oc.verb) { ININFO_message("Filling D(%dx%d) (mask=%p).\n", nmask, ncol, mask); } ii = 0; for (nl=0; nl<DSET_NVOX(in_set); ++nl) { if (!mask || mask[nl]) { THD_extract_array( nl , in_set , 0 , dvec ) ; for (nc=0; nc<ncol; ++nc) D[ii][nc] = dvec[nc]; ++ii; } } /* allocate for answer arrays */ if (!(clusterid = (int *)calloc(sizeof(int), nmask))) { fprintf(stderr,"ERROR: Failed to allocate for clusterid\n"); RETURN(0); } /* now do the clustering (ANDREJ: I do not know why the counting skipped 1st row and 1st col....) */ if (oc.k > 0) { if (oc.verb) { ININFO_message("Going to cluster: k=%d, r=%d\n" "distmetric %c, jobname %s\n", oc.k, oc.r, oc.distmetric, oc.jobname); } example_kmeans( nmask, ncol, D, oc.k, oc.r, oc.distmetric, oc.jobname, clusterid); } else if (oc.kh > 0) { if (oc.verb) { ININFO_message("Going to h cluster: kh=%d\n" "jobname %s\n", oc.kh, oc.jobname); } if ((distmatrix = example_distance_gene(nmask, ncol, D))) { example_hierarchical( nmask, ncol, D, oc.jobname, oc.kh, distmatrix, clusterid); /* YOU SHOULD FREE distmatrix here ...*/ } else { ERROR_message("Failed to create distmatrix"); RETURN(0); } } else { ERROR_message("Bad option selection"); RETURN(0); } /* create output datasets, if required*/ *clust_set = EDIT_empty_copy(in_set) ; EDIT_dset_items( *clust_set , ADN_nvals , 1 , ADN_ntt , 1 , ADN_datum_all , MRI_short , ADN_brick_fac , NULL , ADN_prefix , "OML!" , ADN_none ) ; /* MRI_float */ if (oc.verb) { ININFO_message("loading results into %s\n", DSET_PREFIX(*clust_set)); } /* transfer ints in clusterid to shorts array */ sc = (short *)calloc(sizeof(short),DSET_NVOX(in_set)); ii = 0; for (nl=0; nl<DSET_NVOX(in_set); ++nl) { if (!mask || mask[nl]) { sc[nl] = (short)clusterid[ii]+1; ++ii; } } free(clusterid); clusterid = NULL; EDIT_substitute_brick( *clust_set , 0 , MRI_short , sc ) ; sc = NULL; /* array now in brick */ if (oc.verb) { ININFO_message("Freedom"); } if (dvec) free(dvec); dvec=NULL; // To free D for (ii=0;ii<nmask;++ii) { if (D[ii]) free(D[ii]); } free(D); D = NULL; RETURN(1); }
int main(int argc, char **argv) { int ii=0, ncol=0, nrow=0, nl=0, nc=0, posi=0, posj=0, posk=0; //int nclust=atoi(argv[2]); MRI_IMAGE *im = NULL; double *dar = NULL; double **D = NULL; //int **mask = NULL; double** distmatrix = NULL; //from command.c int i = 1; char* filename = 0; char* jobname = 0; int l = 0; int k = 0; int kh = 3; int r = 1; int s = 0; int x = 2; int y = 1; int Rows, Columns; char distmetric = 'u'; char arraymetric = '\0'; char method = 'm'; char cg = '\0'; char ca = '\0'; int ng = 0; int na = 0; while (i < argc) { const char* const argument = argv[i]; i++; if (strlen(argument)<2) { printf("ERROR: missing argument\n"); return 0; } if (argument[0]!='-') { printf("ERROR: unknown argument\n"); return 0; } if(!strcmp(argument,"--version") || !strcmp(argument,"-v")) { display_version(); return 0; } if(!strcmp(argument,"--help") || !strcmp(argument,"-h")) { display_help(); return 0; } if(!strcmp(argument,"-cg")) { if (i==argc || strlen(argv[i])>1 || !strchr("am",argv[i][0])) { printf ("Error reading command line argument cg\n"); return 0; } cg = argv[i][0]; i++; continue; } if(!strcmp(argument,"-ca")) { if (i==argc || strlen(argv[i])>1 || !strchr("am",argv[i][0])) { printf ("Error reading command line argument ca\n"); return 0; } ca = argv[i][0]; i++; continue; } if(!strcmp(argument,"-ng")) { ng = 1; continue; } if(!strcmp(argument,"-na")) { na = 1; continue; } switch (argument[1]) { case 'l': l=1; break; case 'u': { if (i==argc) { printf ("Error reading command line argument u: " "no job name specified\n"); return 0; } jobname = setjobname(argv[i],0); i++; break; } case 'f': { if (i==argc) { printf ("Error reading command line argument f: " "no file name specified\n"); return 0; } filename = argv[i]; i++; break; } case 'g': { int g; if (i==argc) { printf ("Error reading command line argument g: parameter missing\n"); return 0; } g = readnumber(argv[i]); if (g < 0 || g > 9) { printf ("Error reading command line argument g: " "should be between 0 and 9 inclusive\n"); return 0; } i++; distmetric = getmetric(g); break; } case 'k': { if (i==argc) { printf ("Error reading command line argument k: " "parameter missing\n"); return 0; } k = readnumber(argv[i]); if (k < 1) { printf ("Error reading command line argument k: " "a positive integer is required\n"); return 0; } i++; break; } case 'c': { if (i==argc) { printf ("Error reading command line argument h: parameter missing\n"); return 0; } kh = readnumber(argv[i]); if (kh < 1) { printf ("Error reading command line argument h: a positive integer is required\n"); return 0; } i++; break; } case 'r': { if (i==argc) { printf ("Error reading command line argument r: parameter missing\n"); return 0; } r = readnumber(argv[i]); if (r < 1) { printf ("Error reading command line argument r: " "a positive integer is required\n"); return 0; } i++; break; } case 'm': { if (i==argc || strlen(argv[i])>1 || !strchr("msca",argv[i][0])) { printf ("Error reading command line argument m: should be 'm', 's', 'c', or 'a'\n"); return 0; } method = argv[i][0]; i++; break; } default: printf ("Unknown option\n"); } } if(jobname==0) jobname = setjobname(filename,1); /* else { display_help(); return 0; } */ if (argc < 2) { display_help(); return 0; } //printf("num of clusters %d \n",nclust); fprintf(stderr,"Patience, reading %s...\n ", filename); im = mri_read_double_1D (filename); /* ZIAD I get this warning Aclustering.c:408: warning: passing argument 1 of mri_read_double_1D discards qualifiers from pointer target type Andrej: filename was declared as (const char *), but the function expects (char *) */ if (!im) { fprintf(stderr,"Error: Failed to read matrix data from %s\n", argv[2]); return(-1); } ncol = im->ny; nrow = im->nx; fprintf (stderr,"Have %d cols, %d rows\nNow...\n", ncol, nrow); /* now just get the array and kill the rest */ dar = MRI_DOUBLE_PTR(im); /* make sure that pointer is set to NULL in im, or risk hell */ mri_clear_data_pointer(im); if (im) mri_free(im); im = NULL; /* now kill im */ /* for double loop*/ D = (double **)calloc(sizeof(double*), nrow-1); for (ii=0;ii<(nrow-1);++ii) { D[ii] = (double *)calloc(sizeof(double), ncol-1); } for (nl=1; nl<nrow; ++nl) { for (nc=1; nc<ncol; ++nc) { D[nl-1][nc-1] = dar[nl+nc*nrow]; } //fprintf(stdout,"\n"); } //show_data(nrows, ncols, data, mask); //example_mean_median(nrows, ncols, data, mask); //distmatrix = example_distance_gene(nrows, ncols, data, mask); //if (distmatrix) example_hierarchical(nrows, ncols, data, mask, distmatrix); //example_distance_array(nrows, ncols, data, mask); if(k>0) example_kmeans(nrow-1, ncol-1, D, k, r, distmetric, jobname); else { distmatrix = example_distance_gene(nrow-1, ncol-1, D); // ZIAD: goes2 SIGKILL error if (distmatrix) example_hierarchical(nrow-1, ncol-1, D, jobname, kh, distmatrix); } free(dar); dar = NULL; /* done with input array */ // To free D for (ii=0;ii<(nrow-1);++ii) { if (D[ii]) free(D[ii]); } free(D); free(jobname); //free(); fprintf (stderr,"\n"); return 0; }