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 / pivot.c < prev    next >
C/C++ Source or Header  |  2002-06-25  |  728b  |  46 lines

  1. #define EPS 1.0e-6
  2.  
  3. void pivot (a, n, nl2, ip, kp, q1)
  4.     int n, nl2, *ip, kp;
  5.     double **a, *q1;
  6. {
  7.     register int k, ii, i;
  8.     register double qp, q0, q;
  9.  
  10.     *ip = 0;
  11.     for (i = 1; i <= nl2; i++)
  12.     {
  13.         if (a[i][kp + 1] < -EPS)
  14.         {
  15.             *q1 = -a[i][1] / a[i][kp + 1];
  16.             *ip = i;
  17.             for (i = i + 1; i <= nl2; i++)
  18.             {
  19.                 ii = i;
  20.                 if (a[ii][kp + 1] < -EPS)
  21.                 {
  22.                     q = -a[ii][1] / a[ii][kp + 1];
  23.                     if (q < *q1 )
  24.                     {
  25.                         *ip = ii;
  26.                         *q1 = q;
  27.                     }
  28.                     else if (q == *q1)
  29.                     {
  30.                         for (k = 1; k <= n; k++)
  31.                         {
  32.                             qp = -a[*ip][k + 1] / a[*ip][kp + 1];
  33.                             q0 = -a[ii][k + 1] / a[ii][kp + 1];
  34.                             if (q0 != qp)
  35.                             break;
  36.                         }
  37.                     if (q0 > qp)
  38.                         *ip = ii;
  39.                     }
  40.                 }
  41.             }
  42.         }
  43.     }
  44. }
  45. #undef EPS
  46.