Algorithm-Cluster
view release on metacpan or search on metacpan
src/cluster.c view on Meta::CPAN
for (i = 0; i < nelements; i++) index[i] = i;
for (i = 0; i < nelements; i++) {
j = (int) (i + (nelements-i)*uniform());
ix = index[j];
index[j] = index[i];
index[i] = ix;
}
/* Start the iteration */
for (iter = 0; iter < niter; iter++) {
int ixbest = 0;
int iybest = 0;
int iobject = iter % nelements;
iobject = index[iobject];
if (transpose == 0) {
double closest = metric(ndata, data, celldata[ixbest], mask,
dummymask, weights, iobject, iybest,
transpose);
double radius = maxradius * (1. - ((double)iter)/((double)niter));
double tau = inittau * (1. - ((double)iter)/((double)niter));
for (ix = 0; ix < nxgrid; ix++) {
for (iy = 0; iy < nygrid; iy++) {
double distance = metric(ndata, data, celldata[ix], mask,
dummymask, weights, iobject, iy,
transpose);
if (distance < closest) {
ixbest = ix;
iybest = iy;
closest = distance;
}
}
}
for (ix = 0; ix < nxgrid; ix++) {
for (iy = 0; iy < nygrid; iy++) {
if (sqrt((ix-ixbest)*(ix-ixbest)+(iy-iybest)*(iy-iybest)) <
radius) {
double sum = 0.;
for (i = 0; i < ndata; i++) {
if (mask[iobject][i] == 0) continue;
celldata[ix][iy][i] +=
tau * (data[iobject][i]/stddata[iobject]
-celldata[ix][iy][i]);
}
for (i = 0; i < ndata; i++) {
double term = celldata[ix][iy][i];
src/cluster.c view on Meta::CPAN
}
}
}
else {
double closest;
double** celldatavector = malloc(ndata*sizeof(double*));
double radius = maxradius * (1. - ((double)iter)/((double)niter));
double tau = inittau * (1. - ((double)iter)/((double)niter));
for (i = 0; i < ndata; i++)
celldatavector[i] = &(celldata[ixbest][iybest][i]);
closest = metric(ndata, data, celldatavector, mask, dummymask,
weights, iobject, 0, transpose);
for (ix = 0; ix < nxgrid; ix++) {
for (iy = 0; iy < nygrid; iy++) {
double distance;
for (i = 0; i < ndata; i++)
celldatavector[i] = &(celldata[ixbest][iybest][i]);
distance = metric(ndata, data, celldatavector, mask,
dummymask, weights, iobject, 0,
transpose);
if (distance < closest) {
ixbest = ix;
iybest = iy;
closest = distance;
}
}
}
free(celldatavector);
for (ix = 0; ix < nxgrid; ix++) {
for (iy = 0; iy < nygrid; iy++) {
if (sqrt((ix-ixbest)*(ix-ixbest)+(iy-iybest)*(iy-iybest)) <
radius) {
double sum = 0.;
for (i = 0; i < ndata; i++) {
if (mask[i][iobject] == 0) continue;
celldata[ix][iy][i] +=
tau * (data[i][iobject]/stddata[iobject]
-celldata[ix][iy][i]);
}
for (i = 0; i < ndata; i++) {
double term = celldata[ix][iy][i];
src/cluster.c view on Meta::CPAN
double (*metric) (int, double**, double**, int**, int**,
const double[], int, int, int) = setmetric(dist);
if (transpose == 0) {
int** dummymask = malloc(nygrid*sizeof(int*));
for (i = 0; i < nygrid; i++) {
dummymask[i] = malloc(ncolumns*sizeof(int));
for (j = 0; j < ncolumns; j++) dummymask[i][j] = 1;
}
for (i = 0; i < nrows; i++) {
int ixbest = 0;
int iybest = 0;
double closest = metric(ndata, data, celldata[ixbest], mask,
dummymask, weights, i, iybest, transpose);
int ix, iy;
for (ix = 0; ix < nxgrid; ix++) {
for (iy = 0; iy < nygrid; iy++) {
double distance = metric(ndata, data, celldata[ix], mask,
dummymask, weights, i, iy,
transpose);
if (distance < closest) {
ixbest = ix;
iybest = iy;
closest = distance;
}
}
}
clusterid[i][0] = ixbest;
clusterid[i][1] = iybest;
}
for (i = 0; i < nygrid; i++) free(dummymask[i]);
free(dummymask);
}
else {
double** celldatavector = malloc(ndata*sizeof(double*));
int** dummymask = malloc(nrows*sizeof(int*));
int ixbest = 0;
int iybest = 0;
for (i = 0; i < nrows; i++) {
dummymask[i] = malloc(sizeof(int));
dummymask[i][0] = 1;
}
for (i = 0; i < ncolumns; i++) {
double closest;
int ix, iy;
for (j = 0; j < ndata; j++)
celldatavector[j] = &(celldata[ixbest][iybest][j]);
closest = metric(ndata, data, celldatavector, mask, dummymask,
weights, i, 0, transpose);
for (ix = 0; ix < nxgrid; ix++) {
for (iy = 0; iy < nygrid; iy++) {
double distance;
for (j = 0; j < ndata; j++)
celldatavector[j] = &(celldata[ix][iy][j]);
distance = metric(ndata, data, celldatavector, mask,
dummymask, weights, i, 0, transpose);
if (distance < closest) {
ixbest = ix;
iybest = iy;
closest = distance;
}
}
}
clusterid[i][0] = ixbest;
clusterid[i][1] = iybest;
}
free(celldatavector);
for (i = 0; i < nrows; i++) free(dummymask[i]);
free(dummymask);
}
}
/* ******************************************************************* */
void
( run in 0.468 second using v1.01-cache-2.11-cpan-4e96b696675 )