IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 3104


Ignore:
Timestamp:
Jan 28, 2005, 5:16:20 AM (21 years ago)
Author:
eugene
Message:

fixed memory leak

Location:
trunk/Ohana/src/opihi
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/fit.c

    r2843 r3104  
    9090    }
    9191  }
    92   gaussj (c, nterm, b, 1);
     92  if (!gaussj (c, nterm, b, 1)) goto escape;
    9393
    9494  /* print & save basic fit parameters */
     
    112112  if (!Quiet) fprintf (stderr, "\n");
    113113
     114  for (i = 0; i < nterm; i++) {
     115    free (b[i]);
     116    free (c[i]);
     117  }
     118  free (b);
     119  free (c);
     120  free (s);
    114121  return (TRUE);
    115122
     123escape:
     124  for (i = 0; i < nterm; i++) {
     125    free (b[i]);
     126    free (c[i]);
     127  }
     128  free (b);
     129  free (c);
     130  free (s);
     131  return (FALSE);
    116132}
    117 
    118 
    119 
    120 
  • trunk/Ohana/src/opihi/lib.data/gaussj.c

    r2598 r3104  
    1313    ipiv[j] = 0;
    1414
     15  irow = icol = 0;
     16  big = fabs(a[0][0]);
     17
    1518  for (i = 0; i < n; i++) {
    1619    big = 0.0;
    1720    for (j = 0; j < n; j++) {
     21      if (!finite(a[i][j])) {
     22        fprintf (stderr, "GAUSSJ: NaN\n");
     23        goto escape;
     24      }
    1825      if (ipiv[j] != 1) {
    1926        for (k = 0; k < n; k++) {
     
    2835            if (ipiv[k] > 1) {
    2936              fprintf (stderr, "GAUSSJ: Singular Matrix! (1)\n");
    30               return (0);
     37              goto escape;
    3138            }
    3239        }
     
    4451    if (a[icol][icol] == 0.0) {
    4552      fprintf (stderr, "GAUSSJ: Singular Matrix! (2)\n");
    46       return (0);
     53      goto escape;
     54    }
     55    pivinv = 1.0 / a[icol][icol];
     56    a[icol][icol] = 1.0;
     57    for (l = 0; l < n; l++)
     58      a[icol][l] *= pivinv;
     59    for (l = 0; l < m; l++)
     60      b[icol][l] *= pivinv;
     61    for (ll = 0; ll < n; ll++) {
     62      if (ll != icol) {
     63        dum = a[ll][icol];
     64        a[ll][icol] = 0.0;
     65        for (l = 0; l < n; l++)
     66          a[ll][l] -= a[icol][l]*dum;
     67        for (l = 0; l < m; l++)
     68          b[ll][l] -= b[icol][l]*dum;
     69      }
     70    }
     71  }
     72
     73  for (l = n - 1; l >= 0; l--) {
     74    if (indxr[l] != indxc[l])
     75      for (k = 0; k < n; k++)
     76        SWAP (a[k][indxr[l]], a[k][indxc[l]]);
     77  }
     78  free (ipiv);
     79  free (indxr);
     80  free (indxc);
     81  return (TRUE);
     82
     83escape:
     84  free (ipiv);
     85  free (indxr);
     86  free (indxc);
     87  return (FALSE);
     88}
     89
     90
     91int fgaussj (float **a, int n, float **b, int m) {
     92
     93  int *indxc,*indxr,*ipiv;
     94  int i, icol, irow, j, k, l, ll;
     95  float big,dum,pivinv;
     96 
     97  ALLOCATE (indxc, int, n);
     98  ALLOCATE (indxr, int, n);
     99  ALLOCATE (ipiv, int, n);
     100  for (j = 0; j < n; j++)
     101    ipiv[j] = 0;
     102
     103  irow = icol = 0;
     104  big = fabs(a[0][0]);
     105
     106  for (i = 0; i < n; i++) {
     107    big = 0.0;
     108    for (j = 0; j < n; j++) {
     109      if (!finite(a[i][j])) {
     110        fprintf (stderr, "GAUSSJ: NaN\n");
     111        goto fescape;
     112      }
     113      if (ipiv[j] != 1) {
     114        for (k = 0; k < n; k++) {
     115          if (ipiv[k] == 0) {
     116            if (fabs (a[j][k]) >= big) {
     117              big  = fabs (a[j][k]);
     118              irow = j;
     119              icol = k;
     120            }
     121          }
     122          else
     123            if (ipiv[k] > 1) {
     124              fprintf (stderr, "GAUSSJ: Singular Matrix! (1)\n");
     125              goto fescape;
     126            }
     127        }
     128      }
     129    }
     130    ipiv[icol]++;
     131    if (irow != icol) {
     132      for (l = 0; l < n; l++)
     133        SWAP (a[irow][l], a[icol][l]);
     134      for (l = 0; l < m; l++)
     135        SWAP (b[irow][l], b[icol][l]);
     136    }
     137    indxr[i] = irow;
     138    indxc[i] = icol;
     139    if (a[icol][icol] == 0.0) {
     140      fprintf (stderr, "GAUSSJ: Singular Matrix! (2)\n");
     141      goto fescape;
    47142    }
    48143    pivinv = 1.0 / a[icol][icol];
     
    73168  free (indxc);
    74169  return (1);
    75 }
    76170
    77 
    78 int fgaussj (float **a, int n, float **b, int m) {
    79 
    80   int *indxc,*indxr,*ipiv;
    81   int i, icol, irow, j, k, l, ll;
    82   float big,dum,pivinv;
    83  
    84   ALLOCATE (indxc, int, n);
    85   ALLOCATE (indxr, int, n);
    86   ALLOCATE (ipiv, int, n);
    87   for (j = 0; j < n; j++)
    88     ipiv[j] = 0;
    89 
    90   for (i = 0; i < n; i++) {
    91     big = 0.0;
    92     for (j = 0; j < n; j++) {
    93       if (ipiv[j] != 1) {
    94         for (k = 0; k < n; k++) {
    95           if (ipiv[k] == 0) {
    96             if (fabs (a[j][k]) >= big) {
    97               big  = fabs (a[j][k]);
    98               irow = j;
    99               icol = k;
    100             }
    101           }
    102           else
    103             if (ipiv[k] > 1) {
    104               fprintf (stderr, "GAUSSJ: Singular Matrix! (1)\n");
    105               return (0);
    106             }
    107         }
    108       }
    109     }
    110     ipiv[icol]++;
    111     if (irow != icol) {
    112       for (l = 0; l < n; l++)
    113         SWAP (a[irow][l], a[icol][l]);
    114       for (l = 0; l < m; l++)
    115         SWAP (b[irow][l], b[icol][l]);
    116     }
    117     indxr[i] = irow;
    118     indxc[i] = icol;
    119     if (a[icol][icol] == 0.0) {
    120       fprintf (stderr, "GAUSSJ: Singular Matrix! (2)\n");
    121       return (0);
    122     }
    123     pivinv = 1.0 / a[icol][icol];
    124     a[icol][icol] = 1.0;
    125     for (l = 0; l < n; l++)
    126       a[icol][l] *= pivinv;
    127     for (l = 0; l < m; l++)
    128       b[icol][l] *= pivinv;
    129     for (ll = 0; ll < n; ll++) {
    130       if (ll != icol) {
    131         dum = a[ll][icol];
    132         a[ll][icol] = 0.0;
    133         for (l = 0; l < n; l++)
    134           a[ll][l] -= a[icol][l]*dum;
    135         for (l = 0; l < m; l++)
    136           b[ll][l] -= b[icol][l]*dum;
    137       }
    138     }
    139   }
    140 
    141   for (l = n - 1; l >= 0; l--) {
    142     if (indxr[l] != indxc[l])
    143       for (k = 0; k < n; k++)
    144         SWAP (a[k][indxr[l]], a[k][indxc[l]]);
    145   }
     171fescape:
    146172  free (ipiv);
    147173  free (indxr);
    148174  free (indxc);
    149   return (1);
     175  return (FALSE);
    150176}
Note: See TracChangeset for help on using the changeset viewer.