void eigs_reorder (int d, float * eigval, float * eigvec, int criterion) { int i; int * perm = ivec_new (d); float * eigvalst = fvec_new (d); float * eigvecst = fvec_new (d * d); fvec_sort_index (eigval, d, perm); if (criterion) for (i = 0 ; i < d / 2 ; i++) { int tmp = perm[i]; perm[i] = perm[d - 1 - i]; perm[d - 1 - i] = tmp; } for (i = 0 ; i < d ; i++) { eigvalst[i] = eigval[perm[i]]; memcpy (eigvecst + i * d, eigvec + perm[i] * d, sizeof (*eigvecst) * d); } memcpy (eigval, eigvalst, d * sizeof (*eigval)); memcpy (eigvec, eigvecst, d * d * sizeof (*eigvec)); free (eigvalst); free (eigvecst); free (perm); }
void knn_reorder_shortlist(int n, int nb, int d, int k, const float *b, const float *v, int *assign, float *dists) { float *subb=fvec_new(k*d); float *diststmp=fvec_new(k); int *perm=ivec_new(k); int *assigntmp=ivec_new(k); int i,j; for(i=0;i<n;i++) { int *assigni=assign+i*k; float *disti=dists+i*k; int ki ; if(1) { for(j=0;j<k;j++) { if(assigni[j]<0) break; memcpy(subb+j*d,b+assigni[j]*d,sizeof(*subb)*d); } ki=j; } else { for(j=0;j<k;j++) if(assigni[j]<0) break; ki=j; ivec_sort(assigni,ki); /* to improve access locality */ for(j=0;j<ki;j++) { memcpy(subb+j*d,b+assigni[j]*(long) d,sizeof(*subb)*d); } } compute_distances_1(d,ki,v+i*d,subb,diststmp); fvec_sort_index(diststmp,ki,perm); memcpy(assigntmp,assigni,sizeof(*assigni)*ki); for(j=0;j<ki;j++) { disti[j]=diststmp[perm[j]]; assigni[j]=assigntmp[perm[j]]; } } free(assigntmp); free(diststmp); free(subb); free(perm); }