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 } |