Algorithm-Cluster
view release on metacpan or search on metacpan
src/cluster.c view on Meta::CPAN
If a memory error occurs, cuttree returns 0.
========================================================================
*/
{
int i = -nelements+1; /* top node */
int j;
int k = -1;
int previous = nelements;
const int n = nelements-nclusters; /* number of nodes to join */
int* parents;
if (nclusters == 1) {
for (i = 0; i < nelements; i++) clusterid[i] = 0;
return 1;
}
parents = malloc((nelements-1)*sizeof(int));
if (!parents) return 0;
while (1) {
if (i >= 0) {
clusterid[i] = k;
j = i;
i = previous;
previous = j;
}
else {
j = -i-1;
if (previous == tree[j].left) {
previous = i;
i = tree[j].right;
if (j >= n && (i >= 0 || -i-1 < n)) k++;
}
else if (previous == tree[j].right) {
previous = i;
i = parents[j];
if (i == nelements) break;
}
else {
parents[j] = previous;
previous = i;
i = tree[j].left;
if (j >= n && (i >= 0 || -i-1 < n)) k++;
}
}
}
free(parents);
return 1;
}
/* ******************************************************************** */
static Node*
pclcluster(int nrows, int ncolumns, double** data, int** mask, double weight[],
double** distmatrix, char dist, int transpose)
/*
( run in 0.229 second using v1.01-cache-2.11-cpan-4d50c553e7e )