home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / BarlaA / sw / OLD / Simo / SVM_mono / kernel.c < prev    next >
C/C++ Source or Header  |  2002-06-25  |  4KB  |  176 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "nrutil.h"
  5. #include "patt_rec.h"
  6.  
  7. extern int    dim;
  8. extern int    degree;
  9. extern double    sigma, normalization;
  10. extern int      dim_r,dim_c, delta_g, delta_r, delta_c;
  11.  
  12. double linear_kernel(double *v1, double *v2)
  13. {
  14.     register  i;
  15.     double aux = 0.;
  16.  
  17.     for (i = dim; i > 0; i--)
  18.         aux += *v1++ * *v2++;
  19. /*    fprintf(stderr, "%lf\n", aux/normalization);*/
  20.     return aux/normalization;
  21. }
  22.  
  23. double negative_kernel(double *v1, double *v2)
  24. {
  25.     register  i;
  26.     double aux = 0., tmp;
  27.  
  28.     
  29.     for (i = dim; i > 0; i--) {
  30.         tmp = *v1++ - *v2++;
  31.             aux -= tmp * tmp;
  32.       }
  33.     
  34.     /*
  35.     for (i=dim; i>0; i--) {
  36.       tmp = - (*v1)*(*v1) - (*v2)*(*v2) + 2*(*v1++)(*v2++);
  37.       aux += tmp;
  38.     }
  39.     */
  40.  
  41.  
  42.     return (aux/normalization);
  43. }
  44.  
  45. double poly_kernel(double *v1, double *v2)
  46. {
  47.     register  i;
  48.     double aux = 0.;
  49.     
  50.     for (i = dim; i > 0; i--)
  51.         aux += *v1++ * *v2++;
  52. /*    fprintf(stderr, "%lf\n", pow((aux/normalization + 1.),(double)degree)-1.);*/
  53.     return(pow((aux/normalization + 1.),(double)degree)-1.);
  54. }
  55.  
  56. double rbf_kernel(double *v1, double *v2)
  57. {
  58.     register  i;
  59.     double aux, res = 0.;
  60.     
  61.     for (i = dim; i > 0; i--)
  62.     {
  63.         aux = *v1++ - *v2++;
  64.         res += aux * aux;
  65.     }
  66. /*    fprintf(stderr, "%lf\n", exp(-res/(2*sigma*sigma)));*/
  67.     return exp(-res / (2*sigma*sigma));
  68. }
  69.  
  70. double mv_kernel(double *mod,double *imm)
  71. {
  72.   register i;
  73.   double normal_imm = 0.; 
  74.   double normal_mod = 0.; 
  75.   double mod2[dim],imm2[dim];    /*vettori ausiliarii*/
  76.   double inter = 0.;
  77.   
  78.   for(i=0; i<dim; i++){ 
  79.     //fprintf(stdout,"uffa %lf %lf \n",imm[i],mod[i]);
  80.     normal_imm += imm[i];
  81.     normal_mod += mod[i];
  82.   }
  83.   
  84.   //fprintf(stdout,"%lf %lf\n",normal_imm,normal_mod);
  85.   for(i=0; i<dim; i++){
  86.     imm2[i] = imm[i]/normal_imm;
  87.     mod2[i] = mod[i]/normal_mod;
  88.     inter +=  ilmiomin(imm2[i],mod2[i]);
  89.   }
  90.   
  91.   
  92.   return(inter); 
  93.  
  94.   
  95.  
  96. double haus_kernel(double *v1, double *v2)
  97. {
  98.   register int big_g;
  99.   int i,j,k,ii,jj,kk,h;
  100.   int max_val, counter, tmp_counter;
  101.   int st_k;
  102.   int check=0;
  103.  
  104.   int verbose, occlusion, max_noise;
  105.  
  106.   int type;
  107.   int w_r, w_c;
  108.   double *data_i, *model_data;
  109.   double *data_s, *base, *startp;
  110.   byte pop[ 256 ], *grey;
  111.   double **mat_1, **mat_2;
  112.   int flag=0;
  113.  
  114.   double  *image_s;
  115.   long *addr,*next;
  116.   int **surface, **row_surface, **col_surface, **and,*buffer;
  117.  
  118.   long tot=0;
  119.   
  120.   model_data= v1; //model first
  121.   data_i = v2;    //image second
  122.  
  123.   w_r= dim_r;
  124.   w_c = dim_c;
  125.   counter=0;
  126.  
  127.   /*PROVA DI CAMBIAMENTO CODICE*/
  128.  
  129.   for (i=delta_r; i<(dim_r-delta_r); i++)
  130.     for (j=delta_c; j<(dim_c-delta_c); j++){
  131.       flag=1;
  132.       for (k=-delta_r; k<= delta_r; k++)
  133.     for(h=-delta_c; h<= delta_c; h++)
  134.         if ((fabs(model_data[i*dim_c+j]-data_i[(i+k)*dim_c+j+h]))<=delta_g){
  135.         counter++;
  136.         flag=0; k=delta_r+1; h=delta_c+1;
  137.         }
  138.     }
  139.   return((double)counter/normalization);
  140. }
  141.  
  142.  
  143.  
  144. static double (*kernel_v[])() = {linear_kernel, negative_kernel,poly_kernel, rbf_kernel, mv_kernel, haus_kernel};
  145.  
  146. double kernel(int k, double *v1, double *v2)
  147. {
  148.     switch (k)
  149.     {
  150.         case LINEAR_KERNEL:
  151.             return linear_kernel(v1, v2);
  152.         case NEGATIVE_KERNEL:
  153.             return negative_kernel(v1, v2);
  154.         case POLY_KERNEL:
  155.             return poly_kernel(v1, v2);
  156.         case RBF_KERNEL:
  157.             return rbf_kernel(v1, v2);
  158.         case MV_KERNEL:
  159.             return mv_kernel(v1, v2);
  160.         case HAUS_KERNEL:
  161.           {
  162.             return (haus_kernel(v1, v2)+haus_kernel(v2, v1))/2;
  163.           }
  164.                 case HAUS_KERNEL_SIMM:
  165.                   {
  166.                     return (haus_kernel(v1, v2)+haus_kernel(v2, v1))/2;
  167.                    }
  168.                 fprintf(stderr, "Unknown kernel\n");
  169.             exit(-1);
  170.     }
  171.     return (*kernel_v[k])(v1, v2);
  172. }
  173.  
  174.  
  175.