41 #include "EST_system.h"
42 #include "EST_FMatrix.h"
43 #include "EST_cluster.h"
45 #include "EST_string_aux.h"
51 float lval(
EST_FMatrix &a,
float floor,
int &row,
int &col);
54 void init_cluster(
EST_CBK &cbk,
int n)
59 for (i = 0; i < n; ++i)
71 while (cbk.length() > 1)
73 dist = nn_cluster3(m, cbk, method);
74 ans.
append(print_codebook(cbk, dist, names));
84 for (p = l.head(); p != 0; p = p->next())
96 for (i = 0, pi = group.head(); pi != 0; pi = pi->next(), ++i)
97 for (j = 0, pj = group.head(); pj != 0; pj = pj->next(), ++j)
98 d(group(pi), group(pj)) = 0.0;
121 for (pi = cbk.head(); pi != 0; pi = pi->next())
122 if (contains(cbk(pi), row))
125 for (pj = cbk.head(); pj != 0; pj = pj->next())
126 if (contains(cbk(pj), col))
130 remove_distances(d, cbk(pi));
134 float min(
float a,
float b)
136 return (a < b) ? a: b;
139 float max(
float a,
float b)
141 return (a > b) ? a: b;
153 cout <<
"Removing row/column " << col << endl;
154 cout <<
"row " <<cbk.
nth(row) << endl;
155 cout <<
"col " <<cbk.
nth(col) << endl;
156 cbk.
nth(row) += cbk.
nth(col);
157 cout <<
"row " <<cbk.
nth(row) << endl;
161 if ((i != row) && (i != col))
165 cout <<
"row " << row <<
" col " << col <<
" left out " << v;
167 for (pi = v.head(); pi != 0; pi = pi->next())
169 if (method ==
"nearest")
170 fm = min(d(row,v(pi)),d(col,v(pi)));
171 else if (method ==
"furthest")
172 fm = max(d(row,v(pi)),d(col,v(pi)));
174 fm = min(d(row,v(pi)),d(col,v(pi)));
176 cout <<
"writing values to " << v(pi) <<
", " << row <<
" min "
182 d = sub(d, col, col);
188 static float smallest = 0.0;
195 smallest = lval(m, smallest, row, col);
196 cout <<
"smallest = " << smallest << endl;
197 cout <<
"row = " << row <<
" col " << col << endl;
198 collapse(m, cbk, row, col);
200 for (
EST_Litem *p = cbk.head(); p != 0; p = p->next())
202 cout <<
"New matrix\n" << m;
210 static float smallest = 0.0;
216 cout <<
"analysing matrix\n" << m;
217 smallest = lval(m, smallest, row, col);
218 cout <<
"smallest = " << smallest << endl;
219 cout <<
"row = " << row <<
" col " << col << endl;
220 collapse3(m, cbk, row, col, method);
222 for (
EST_Litem *p = cbk.head(); p != 0; p = p->next())
224 cout <<
"New matrix\n" << m << endl << endl;
238 for (pi = cbk.head(); pi != 0; pi = pi->next(), ++i)
240 for (pj = pi->next(); pj != 0; pj = pj->next())
242 smallest = lowestval(m, cbk(pj), cbk(pi));
251 for (pi = cbk.head(); pi != 0; pi = pi->next())
255 cout <<
"Empty entry\n";
273 for (pi = cbk.head(); pi != 0; pi = pi->next(), ++i)
275 for (pj = pi->next(); pj != 0; pj = pj->next())
277 smallest = highestval(m, cbk(pj), cbk(pi));
286 for (pi = cbk.head(); pi != 0; pi = pi->next())
290 cout <<
"Empty entry\n";
301 static int sorttest(
const void *a,
const void *b)
303 float *c = (
float *)a;
304 float *d = (
float *)b;
305 float res = (*c - *d);
308 return (res < 0.0) ? -1 : 1;
321 for (i = 0; i < size; ++i)
324 cout<<
"number of values in EST_FMatrix:" << n_vals <<
" size " << size << endl;
326 v =
new float[n_vals];
328 for (i = k = 0; i < m.
num_rows(); ++i)
331 cout << i <<
" " << j <<
" " << k <<
" " << (i * size) + k << endl;
335 for (i = 0; i < n_vals; ++i)
336 cout <<
"v[" << i <<
"] = " << v[i] << endl;
338 qsort(v, n_vals,
sizeof(
float), sorttest);
341 for (i = 0; i < n_vals; ++i)
353 s = ftoString(d) +
" ";
354 for (pi = cbk.head(); pi != 0; pi = pi->next())
357 for (pj = cbk(pi).head(); pj != 0; pj = pj->next())
360 s += itoString(cbk.
item(pi).item(pj));
362 s += names.
nth(cbk.
item(pi).item(pj));
379 for (i = 0; i < n; ++i)
382 for (i = 0; i < n; ++i)
383 cout <<
"n: " << i <<
" " << oldcbk[i] << endl;
386 for (i = 0; i < n; ++i)
387 for (j = i + 1; j < n; ++j)
389 smallest = lowestval(m, oldcbk[j], oldcbk[i]);
390 cout <<
"smallest = " << smallest <<
" d= " << d << endl << endl;
393 cout <<
"merging " << i <<
" " << j << endl << endl;
399 for (i = 0; i < n; ++i)
400 cout <<
"n: " << i <<
" " << oldcbk[i] << endl;
439 float lowest = 100000.0;
441 cout <<
"list a:" << a <<
"list b:" << b;
443 for (pa = a.head(); pa != 0; pa = pa->next())
444 for (pb = b.head(); pb != 0; pb = pb->next())
447 if (m(a(pa), b(pb)) < lowest)
448 lowest = m(a(pa), b(pb));
456 float lval(
EST_FMatrix &a,
float floor,
int &row,
int &col)
459 float lowest = FLT_MAX;
463 if ((a(i, j) < lowest) && (a(i, j) > floor))
477 cout <<
"list a:" << a <<
"list b:" << b;
479 for (pa = a.head(); pa != 0; pa = pa->next())
480 for (pb = b.head(); pb != 0; pb = pb->next())
482 if (m(a(pa), b(pb)) > h)
509 for (p = cbk[j].head(); p != 0; p = p->next())
510 cbk[i].append(cbk[j].item(p));
521 if (!inf) cerr <<
"Can't open names file " << file << endl;
523 while(inf.getline(inbuf, 1000))