// the cols contains codevectors double kmeansiter(Array<vec> &DB, mat &codebook) { int DIM = DB(0).length(), SIZE = codebook.cols(), T = DB.length(); vec x, xnum(SIZE); mat xsum(DIM, SIZE); int MinIndex, i, j, k; double MinS, S, D, *xp, *cp; xsum.clear(); xnum.clear(); D = 1E20; D = 0; for (k = 0;k < T;k++) { x = DB(k); xp = x._data(); MinS = 1E20; MinIndex = 0; for (i = 0;i < SIZE;i++) { cp = &codebook(0, i); S = sqr(xp[0] - cp[0]); for (j = 1;j < DIM;j++) { S += sqr(xp[j] - cp[j]); if (S >= MinS) goto sune; } MinS = S; MinIndex = i; sune: void(); } D += MinS; cp = &xsum(0, MinIndex); for (j = 0;j < DIM;j++) { cp[j] += xp[j]; } xnum(MinIndex)++; } for (i = 0;i < SIZE;i++) { for (j = 0;j < DIM;j++) { codebook(j, i) = xsum(j, i) / xnum(i); } } return D; }
static void md5str_to_md5sum (const char *str, unsigned char *sum) { int i = 0; int j = 0; int ch = 0; for (i = 0; i < 32; i++) { if (!(i % 2)) { ch = xnum (str[i]); continue; } ch <<= 4; ch += xnum (str[i]); sum[j] = ch; j++; } }