00001
00007
00008
00009
00010
00011
00012
00013
00014 #include "random.h"
00015
00016
00017 typedef struct
00018 {
00019 vl_int32 w;
00020 vl_int32 j;
00021 } pair_t;
00022
00023 static int cmp_pair (void const *a, void const *b)
00024 {
00025 pair_t *pa = (pair_t *) a;
00026 pair_t *pb = (pair_t *) b;
00027 vl_int32 d = pa->w - pb->w ;
00028 if (d) return d ;
00029
00030 return pa->j - pb->j;
00031 }
00032
00033 VL_INLINE vl_uint32 calc_dist2 (vl_int32 const* A, vl_uint8 const* B, int M)
00034 {
00035 vl_uint32 acc = 0;
00036 int i = 0 ;
00037 for (i = 0 ; i < M ; ++i) {
00038 vl_int32 dist = A [i] - B [i] ;
00039 acc += dist * dist ;
00040 }
00041 return acc ;
00042 }
00043
00051 static void alloc (VlIKMFilt *f, int M, int K)
00052 {
00053 if (f-> centers) vl_free (f-> centers) ;
00054 f-> K = K ;
00055 f-> M = M ;
00056 f-> centers = vl_malloc (sizeof(vl_ikm_acc) * M * K) ;
00057 }
00058
00059
00064 static
00065 void vl_ikm_init_helper (VlIKMFilt *f)
00066 {
00067 switch (f-> method) {
00068 case VL_IKM_LLOYD: vl_ikm_init_lloyd (f) ; break ;
00069 case VL_IKM_ELKAN: vl_ikm_init_elkan (f) ; break ;
00070 }
00071 }
00072
00080 VL_EXPORT
00081 void
00082 vl_ikm_init (VlIKMFilt* f, vl_ikm_acc const * centers, int M, int K)
00083 {
00084 alloc (f, M, K) ;
00085
00086 memcpy (f-> centers, centers, sizeof(vl_ikm_acc) * M * K) ;
00087
00088 vl_ikm_init_helper (f) ;
00089 }
00090
00097 VL_EXPORT
00098 void
00099 vl_ikm_init_rand
00100 (VlIKMFilt* f, int M, int K)
00101 {
00102 int k, i ;
00103
00104 alloc (f, M, K) ;
00105
00106 for (k = 0 ; k < K ; ++ k) {
00107 for (i = 0 ; i < M ; ++ i) {
00108 f-> centers [k * M + i] = (vl_ikm_acc) (vl_rand_uint32 ()) ;
00109 }
00110 }
00111
00112 vl_ikm_init_helper (f) ;
00113 }
00114
00123 VL_EXPORT
00124 void
00125 vl_ikm_init_rand_data
00126 (VlIKMFilt* f, vl_uint8 const* data, int M, int N, int K)
00127 {
00128 int i, j, k ;
00129 pair_t *pairs = (pair_t *) vl_malloc (sizeof(pair_t) * N);
00130
00131 alloc (f, M, K) ;
00132
00133
00134 for (j = 0 ; j < N ; ++j) {
00135 pairs[j].j = j ;
00136 pairs[j].w = ((vl_int32) vl_rand_uint32 ()) >> 2 ;
00137 }
00138
00139 qsort (pairs, N, sizeof(pair_t), cmp_pair);
00140
00141
00142 for (j = 0, k = 0 ; k < K ; ++ k) {
00143
00144
00145 for ( ; j < N - 1 ; ++j) {
00146 int prevk = 0 ;
00147 for (prevk = 0 ; prevk < k ; ++ prevk) {
00148 vl_uint32 dist = calc_dist2
00149 (f-> centers + prevk * M,
00150 data + pairs[j].j * M, M) ;
00151 if (dist == 0) break ;
00152 }
00153 if (prevk == k) break ;
00154 }
00155
00156 for (i = 0 ; i < M ; ++ i) {
00157 f-> centers [k * M + i] = data [pairs[j].j * M + i] ;
00158 }
00159
00160 if (j < N - 1) ++ j ;
00161 }
00162
00163 vl_free (pairs) ;
00164 vl_ikm_init_helper (f) ;
00165 }
00166
00167
00168
00169
00170
00171