Exemple #1
0
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);
}
Exemple #2
0
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);
}