Doxygen Source Code Documentation
StatClust.c File Reference
Go to the source code of this file.
Data Structures | |
| struct | cluster |
| struct | voxel |
Typedefs | |
| typedef cluster | cluster |
| typedef voxel | voxel |
Functions | |
| voxel * | new_voxel (int index) |
| void | print_voxel (voxel *voxel_ptr) |
| void | print_all_voxels (voxel *voxel_ptr) |
| cluster * | initialize_cluster () |
| void | print_cluster (cluster *clust_ptr, char *str, matrix s) |
| void | print_all_clusters (cluster *clust_ptr, matrix s) |
| void | save_cluster (cluster *clust_ptr, byte iclust, byte *bar) |
| void | save_all_clusters (cluster *clust_ptr, byte *bar) |
| float | cluster_distance (cluster *aclust, cluster *bclust) |
| void | find_nearest_cluster (cluster *new_cluster, cluster *head_cluster) |
| void | add_cluster (cluster *new_cluster, cluster *head_cluster) |
| cluster * | new_cluster (int index, float *centroid, cluster *head_clust) |
| void | delete_cluster (cluster *clust_ptr) |
| void | destroy_cluster (cluster *clust_ptr) |
| cluster * | remove_clusters (cluster *aclust, cluster *bclust, cluster *head_clust) |
| cluster * | merge_clusters (cluster *aclust, cluster *bclust) |
| cluster * | consolidate_clusters (cluster *aclust, cluster *bclust, cluster *head_clust) |
| cluster * | agglomerate_clusters (cluster *head_clust, int print_flag) |
| cluster * | sort_clusters (cluster *head_clust) |
| void | calc_covariance (matrix *s, matrix *sinv) |
Typedef Documentation
|
|
|
|
|
|
Function Documentation
|
||||||||||||
|
Definition at line 309 of file StatClust.c. References find_nearest_cluster(), new_cluster(), and cluster::next_cluster. Referenced by consolidate_clusters(), and new_cluster().
00310 {
00311
00312 new_cluster->next_cluster = head_cluster;
00313
00314 find_nearest_cluster (new_cluster, head_cluster);
00315
00316 }
|
|
||||||||||||
|
Definition at line 507 of file StatClust.c. References consolidate_clusters(), cluster::nearest_cluster, cluster::nearest_dist, and cluster::next_cluster. Referenced by form_clusters().
00508 {
00509 const float MAX_DIST = 1.0e+30;
00510
00511 cluster * clust_ptr = NULL;
00512 cluster * aclust = NULL;
00513 cluster * bclust = NULL;
00514 float min_dist;
00515
00516
00517 /*----- Find the two clusters which are closest together -----*/
00518 min_dist = MAX_DIST;
00519 clust_ptr = head_clust;
00520 while (clust_ptr != NULL)
00521 {
00522 if (clust_ptr->nearest_dist < min_dist)
00523 {
00524 min_dist = clust_ptr->nearest_dist;
00525 aclust = clust_ptr;
00526 bclust = clust_ptr->nearest_cluster;
00527 }
00528 clust_ptr = clust_ptr->next_cluster;
00529 }
00530
00531
00532 /*----- Identify clusters which are to be merged -----*/
00533 if (print_flag)
00534 {
00535 int iclust, iaclust, ibclust;
00536
00537 clust_ptr = head_clust;
00538 iclust = 0;
00539 while (clust_ptr != NULL)
00540 {
00541 iclust++;
00542 if (aclust == clust_ptr) iaclust = iclust;
00543 if (bclust == clust_ptr) ibclust = iclust;
00544 clust_ptr = clust_ptr->next_cluster;
00545 }
00546
00547 printf ("Merging cluster #%d and cluster #%d \n", iaclust, ibclust);
00548 printf ("Distance = %f \n", min_dist);
00549 }
00550
00551
00552 /*----- Merge these two clusters -----*/
00553 head_clust = consolidate_clusters (aclust, bclust, head_clust);
00554
00555
00556 return (head_clust);
00557 }
|
|
||||||||||||
|
Definition at line 631 of file StatClust.c. References matrix::elts, vector::elts, matrix_create(), matrix_destroy(), matrix_initialize(), matrix_inverse(), matrix_sprint(), matrix_sqrt(), SC_error(), vector_create(), vector_destroy(), vector_initialize(), and vector_sprint(). Referenced by form_clusters().
00636 {
00637 int ivox; /* voxel indices */
00638 int ip, jp; /* parameter indices */
00639 int ok; /* Boolean for successful matrix calc. */
00640
00641 vector mean; /* mean parameter vector */
00642 matrix covar; /* variance-covariance matrix */
00643 matrix cinv; /* inverse of covariance matrix */
00644
00645 char message[80]; /* error message */
00646
00647
00648 /*----- Initialize vectors and matrices -----*/
00649 vector_initialize (&mean);
00650 matrix_initialize (&covar);
00651 matrix_initialize (&cinv);
00652
00653
00654 /*----- Allocate space for mean and covariance matrices -----*/
00655 vector_create (SC_dimension, &mean);
00656 matrix_create (SC_dimension, SC_dimension, &covar);
00657
00658
00659 /*----- Calculate parameter sums and products -----*/
00660 for (ivox = 0; ivox < SC_nvox; ivox++)
00661 for (ip = 0; ip < SC_dimension; ip++)
00662 {
00663 mean.elts[ip] += SC_parameters[ip][ivox];
00664 for (jp = 0; jp < SC_dimension; jp++)
00665 if ((ip == jp) || (SC_statdist == 2))
00666 covar.elts[ip][jp] +=
00667 SC_parameters[ip][ivox] * SC_parameters[jp][ivox];
00668 }
00669
00670
00671 /*----- Calculate the mean parameter vector -----*/
00672 for (ip = 0; ip < SC_dimension; ip++)
00673 mean.elts[ip] = mean.elts[ip] / SC_nvox;
00674 if (SC_verb)
00675 vector_sprint ("Mean parameter vector: ", mean);
00676
00677
00678 /*----- Calculate the covariance matrix -----*/
00679 for (ip = 0; ip < SC_dimension; ip++)
00680 for (jp = 0; jp < SC_dimension; jp++)
00681 if ((ip == jp) || (SC_statdist == 2))
00682 covar.elts[ip][jp] = (covar.elts[ip][jp]
00683 - SC_nvox * mean.elts[ip] * mean.elts[jp])
00684 / (SC_nvox - 1);
00685 if (SC_verb)
00686 if (SC_statdist == 1)
00687 matrix_sprint ("Parameter variance (diagonal) matrix: ", covar);
00688 else
00689 matrix_sprint ("Parameter covariance matrix: ", covar);
00690
00691 /*----- Note: The following sequence of calculations is necessary
00692 in order to generate an error message in the event of
00693 perfectly correlated input parameters -----*/
00694
00695 /*----- Calculate inverse of covariance matrix -----*/
00696 ok = matrix_inverse (covar, &cinv);
00697 if (! ok)
00698 SC_error
00699 ("Unable to calculate inverse of covariance matrix");
00700
00701 /*----- Calculate square root of inverse covariance matrix -----*/
00702 ok = matrix_sqrt (cinv, sinv);
00703 if (! ok)
00704 SC_error
00705 ("Unable to calculate square root of inverse of covariance matrix");
00706
00707 /*----- Calculate square root of covariance matrix -----*/
00708 ok = matrix_inverse (*sinv, s);
00709 if (! ok)
00710 SC_error
00711 ("Unable to calculate square root of covariance matrix");
00712
00713
00714 /*----- Deallocate memory -----*/
00715 vector_destroy (&mean);
00716 matrix_destroy (&covar);
00717 matrix_destroy (&cinv);
00718
00719
00720 }
|
|
||||||||||||
|
Definition at line 241 of file StatClust.c. References cluster::centroid, and i. Referenced by find_nearest_cluster().
|
|
||||||||||||||||
|
Definition at line 479 of file StatClust.c. References add_cluster(), merge_clusters(), and remove_clusters(). Referenced by agglomerate_clusters().
00481 {
00482 cluster * abclust = NULL;
00483
00484
00485 /*----- Merge two clusters into one new cluster -----*/
00486 abclust = merge_clusters (aclust, bclust);
00487
00488
00489 /*----- Remove the two original clusters from the linked list -----*/
00490 head_clust = remove_clusters (aclust, bclust, head_clust);
00491
00492
00493 /*----- Add the merged cluster to the linked list -----*/
00494 add_cluster (abclust, head_clust);
00495
00496
00497 /*----- Merged cluster is now at the top of the list -----*/
00498 return (abclust);
00499 }
|
|
|
Definition at line 347 of file StatClust.c. References cluster::centroid, free, and cluster::voxel_ptr. Referenced by destroy_cluster(), remove_clusters(), and sort_clusters().
|
|
|
Definition at line 371 of file StatClust.c. References delete_cluster(), free, and cluster::voxel_ptr. Referenced by form_clusters().
00372 {
00373 if (clust_ptr != NULL)
00374 {
00375 if (clust_ptr->voxel_ptr != NULL)
00376 free (clust_ptr->voxel_ptr);
00377
00378 delete_cluster (clust_ptr);
00379 }
00380 }
|
|
||||||||||||
|
Definition at line 265 of file StatClust.c. References cluster_distance(), cluster::nearest_cluster, cluster::nearest_dist, new_cluster(), and cluster::next_cluster. Referenced by add_cluster(), and remove_clusters().
00266 {
00267 const float MAX_DIST = 1.0e+30;
00268
00269 cluster * clust_ptr = NULL;
00270 float dist;
00271
00272
00273 /*----- Initialize nearest cluster elements -----*/
00274 new_cluster->nearest_dist = MAX_DIST;
00275 new_cluster->nearest_cluster = NULL;
00276
00277
00278 clust_ptr = head_cluster;
00279
00280 while (clust_ptr != NULL)
00281 {
00282 if (clust_ptr != new_cluster)
00283 {
00284 dist = cluster_distance (new_cluster, clust_ptr);
00285
00286 if (dist < new_cluster->nearest_dist)
00287 {
00288 new_cluster->nearest_dist = dist;
00289 new_cluster->nearest_cluster = clust_ptr;
00290 }
00291
00292 if (dist < clust_ptr->nearest_dist)
00293 {
00294 clust_ptr->nearest_dist = dist;
00295 clust_ptr->nearest_cluster = new_cluster;
00296 }
00297 }
00298
00299 clust_ptr = clust_ptr->next_cluster;
00300 }
00301 }
|
|
|
Definition at line 112 of file StatClust.c. References cluster::centroid, malloc, MTEST, cluster::nearest_cluster, cluster::nearest_dist, cluster::next_cluster, cluster::num_voxels, and cluster::voxel_ptr. Referenced by merge_clusters(), new_cluster(), and sort_clusters().
00113 {
00114 cluster * clust_ptr = NULL;
00115
00116 clust_ptr = (cluster *) malloc (sizeof(cluster));
00117 MTEST (clust_ptr);
00118
00119 clust_ptr->next_cluster = NULL;
00120 clust_ptr->num_voxels = 0;
00121 clust_ptr->voxel_ptr = NULL;
00122 clust_ptr->centroid = NULL;
00123 clust_ptr->nearest_dist = 0.0;
00124 clust_ptr->nearest_cluster = NULL;
00125 return (clust_ptr);
00126
00127 }
|
|
||||||||||||
|
Definition at line 443 of file StatClust.c. References cluster::centroid, i, initialize_cluster(), malloc, MTEST, voxel::next_voxel, cluster::num_voxels, and cluster::voxel_ptr. Referenced by consolidate_clusters().
00444 {
00445 cluster * abclust = NULL;
00446 voxel * voxel_ptr = NULL;
00447 int na, nb;
00448 int i;
00449
00450 abclust = initialize_cluster ();
00451
00452 na = aclust->num_voxels;
00453 nb = bclust->num_voxels;
00454 abclust->num_voxels = na + nb;
00455
00456 abclust->centroid = (float *) malloc (sizeof(float) * SC_dimension);
00457 MTEST (abclust->centroid);
00458
00459 for (i = 0; i < SC_dimension; i++)
00460 abclust->centroid[i]
00461 = (na*aclust->centroid[i] + nb*bclust->centroid[i]) / (na+nb);
00462
00463 abclust->voxel_ptr = aclust->voxel_ptr;
00464
00465 voxel_ptr = abclust->voxel_ptr;
00466 while (voxel_ptr->next_voxel != NULL)
00467 voxel_ptr = voxel_ptr->next_voxel;
00468 voxel_ptr->next_voxel = bclust->voxel_ptr;
00469
00470 return (abclust);
00471 }
|
|
||||||||||||||||
|
Definition at line 324 of file StatClust.c. References add_cluster(), cluster::centroid, initialize_cluster(), new_voxel(), cluster::num_voxels, and cluster::voxel_ptr. Referenced by add_cluster(), find_nearest_cluster(), and form_clusters().
00325 {
00326 cluster * clust_ptr = NULL;
00327 voxel * voxel_ptr = NULL;
00328
00329 clust_ptr = initialize_cluster ();
00330
00331 clust_ptr->num_voxels = 1;
00332 clust_ptr->voxel_ptr = new_voxel(index);
00333 clust_ptr->centroid = centroid;
00334
00335 add_cluster (clust_ptr, head_clust);
00336
00337 return (clust_ptr);
00338
00339 }
|
|
|
Definition at line 66 of file StatClust.c. References voxel::index, malloc, MTEST, and voxel::next_voxel. Referenced by new_cluster(), and process_volume().
|
|
||||||||||||
|
Definition at line 177 of file StatClust.c. References cluster::next_cluster, and print_cluster(). Referenced by form_clusters().
00178 {
00179 int iclust = 0;
00180 char str[30];
00181
00182 while (clust_ptr != NULL)
00183 {
00184 iclust++;
00185 sprintf (str, "#%d", iclust);
00186 print_cluster (clust_ptr, str, s);
00187 clust_ptr = clust_ptr->next_cluster;
00188 }
00189
00190 }
|
|
|
Definition at line 96 of file StatClust.c. References voxel::next_voxel, and print_voxel().
00097 {
00098 while (voxel_ptr != NULL)
00099 {
00100 print_voxel (voxel_ptr);
00101 voxel_ptr = voxel_ptr->next_voxel;
00102 }
00103 printf ("\n");
00104 }
|
|
||||||||||||||||
|
Definition at line 135 of file StatClust.c. References array_to_vector(), cluster::centroid, i, cluster::num_voxels, v, vector_destroy(), vector_initialize(), vector_multiply(), vector_print(), and cluster::voxel_ptr. Referenced by print_all_clusters().
00136 {
00137 int i;
00138 vector v, sv;
00139 vector_initialize (&v);
00140 vector_initialize (&sv);
00141
00142 printf ("Cluster %s \n", str);
00143
00144 if (clust_ptr->voxel_ptr != NULL)
00145 {
00146 printf ("# Voxels = %d \n", clust_ptr->num_voxels);
00147
00148 /*
00149 printf ("Voxels: ");
00150
00151 print_all_voxels (clust_ptr->voxel_ptr);
00152 */
00153 }
00154
00155 if (clust_ptr->centroid != NULL)
00156 {
00157 printf ("Centroid: \n");
00158 array_to_vector (SC_dimension, clust_ptr->centroid, &v);
00159 vector_multiply (s, v, &sv);
00160 vector_print (sv);
00161 }
00162
00163 /*
00164 printf ("Nearest cluster distance = %f \n", clust_ptr->nearest_dist);
00165 */
00166
00167 vector_destroy (&v);
00168 vector_destroy (&sv);
00169 }
|
|
|
Definition at line 84 of file StatClust.c. References voxel::index. Referenced by print_all_voxels().
00085 {
00086 if (voxel_ptr != NULL)
00087 printf ("%d ", voxel_ptr->index);
00088 }
|
|
||||||||||||||||
|
Definition at line 390 of file StatClust.c. References delete_cluster(), find_nearest_cluster(), cluster::nearest_cluster, and cluster::next_cluster. Referenced by consolidate_clusters().
00392 {
00393 cluster * clust_ptr = NULL;
00394 cluster * next_clust = NULL;
00395
00396
00397 while ((head_clust != NULL) &&
00398 ((head_clust == aclust) || (head_clust == bclust)))
00399 head_clust = head_clust->next_cluster;
00400
00401
00402 if (head_clust != NULL)
00403 {
00404
00405 clust_ptr = head_clust;
00406 next_clust = clust_ptr->next_cluster;
00407 while (next_clust != NULL)
00408 {
00409 if ((next_clust == aclust) || (next_clust == bclust))
00410 clust_ptr->next_cluster = next_clust->next_cluster;
00411 else
00412 clust_ptr = next_clust;
00413
00414 next_clust = clust_ptr->next_cluster;
00415 }
00416
00417
00418 clust_ptr = head_clust;
00419 while (clust_ptr != NULL)
00420 {
00421 if ((clust_ptr->nearest_cluster == aclust)
00422 || (clust_ptr->nearest_cluster == bclust))
00423 {
00424 find_nearest_cluster (clust_ptr, head_clust);
00425 }
00426 clust_ptr = clust_ptr->next_cluster;
00427 }
00428 }
00429
00430
00431 delete_cluster (aclust);
00432 delete_cluster (bclust);
00433
00434 return (head_clust);
00435 }
|
|
||||||||||||
|
Definition at line 221 of file StatClust.c. References cluster::next_cluster, and save_cluster(). Referenced by form_clusters().
00222 {
00223 byte iclust = 0;
00224
00225 while (clust_ptr != NULL)
00226 {
00227 iclust++;
00228 save_cluster (clust_ptr, iclust, bar);
00229 clust_ptr = clust_ptr->next_cluster;
00230 }
00231
00232 }
|
|
||||||||||||||||
|
Definition at line 198 of file StatClust.c. References i, voxel::index, voxel::next_voxel, and cluster::voxel_ptr. Referenced by save_all_clusters().
00199 {
00200 int i;
00201 voxel * voxel_ptr = NULL;
00202
00203
00204 voxel_ptr = clust_ptr->voxel_ptr;
00205
00206
00207 while (voxel_ptr != NULL)
00208 {
00209 bar[voxel_ptr->index] = iclust;
00210 voxel_ptr = voxel_ptr->next_voxel;
00211 }
00212
00213 }
|
|
|
Definition at line 565 of file StatClust.c. References delete_cluster(), i, initialize_cluster(), mp, cluster::next_cluster, and cluster::num_voxels. Referenced by form_clusters().
00566 {
00567 cluster * i = NULL;
00568 cluster * ip = NULL;
00569 cluster * m = NULL;
00570 cluster * mp = NULL;
00571 cluster * j = NULL;
00572 cluster * jp = NULL;
00573 cluster * guard = NULL;
00574
00575
00576 /*----- Create guard cluster in case head cluster must be replaced -----*/
00577 guard = initialize_cluster();
00578 guard->next_cluster = head_clust;
00579 ip = guard;
00580
00581 while (ip->next_cluster != NULL)
00582 {
00583 /*----- Initialize search for next largest cluster -----*/
00584 i = ip->next_cluster; /* current top of list */
00585 mp = ip; /* cluster pointing to next largest cluster */
00586 m = i; /* next largest cluster */
00587 jp = i;
00588
00589 /*----- Search through list for next largest cluster -----*/
00590 while (jp->next_cluster != NULL)
00591 {
00592 j = jp->next_cluster;
00593 if (j->num_voxels > m->num_voxels)
00594 {
00595 mp = jp;
00596 m = j;
00597 }
00598 jp = j;
00599 }
00600
00601 /*----- Now move next largest cluster to top of list -----*/
00602 if (m != i)
00603 {
00604 ip->next_cluster = m;
00605 mp->next_cluster = m->next_cluster;
00606 m->next_cluster = i;
00607 i = m;
00608 }
00609
00610 /*----- Move down the list -----*/
00611 ip = i;
00612
00613 }
00614
00615
00616 /*----- Replace head cluster -----*/
00617 head_clust = guard->next_cluster;
00618 delete_cluster (guard);
00619
00620 return (head_clust);
00621 }
|