/* returns -1 if ill-conditioned matrix */
/*------------------------------------------------------*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include <math.h>
#include <stdlib.h>
+#include "xmalloc.h"
#define SMALL 0.00001
int firm_gaussjordansolve(double *A, double *vec, int nsize)
{
- int i, j, row, col, col2, biggest_r, biggest_c;
+ int i, j, row, col, col2, biggest_r = 0, biggest_c = 0, t;
double big, temp, sum;
- double *x = malloc(nsize * sizeof(double));
- double *scramvec = malloc(nsize * sizeof(double));
+ double *scramvec = xmalloc(nsize * sizeof(*scramvec));
+ int *x = xmalloc(nsize * sizeof(*x));
#define _A(row,col) A[(row)*nsize + (col)]
/* init x[] */
/* find the largest left in LRH box */
for(row=col;row<nsize;row++) {
for(col2=col;col2<nsize;col2++) {
- temp = fabs(_A(row,col2));
- if (temp > big) {
- biggest_r = row;
- biggest_c = col2;
- big = temp; /* largest element left */
- }
+ temp = fabs(_A(row,col2));
+ if (temp > big) {
+ biggest_r = row;
+ biggest_c = col2;
+ big = temp; /* largest element left */
+ }
}
}
if (big < SMALL) {
_A(i,biggest_c) = temp;
}
/* swap unknowns */
- temp = x[col];
+ t = x[col];
x[col] = x[biggest_c];
- x[biggest_c] = temp;
+ x[biggest_c] = t;
/* partially annihilate this col */
/* zero columns below diag */
/* annihilates A[][] */
for(i=col;i<nsize;i++)
- _A(row,i) = _A(row,i) - temp * _A(col,i);
+ _A(row,i) = _A(row,i) - temp * _A(col,i);
/* same op on vec */
vec[row] = vec[row] - temp * vec[col];
}
}
- /* back-solve, store solution in srcamvec */
+ /* back-solve, store solution in scramvec */
scramvec[nsize - 1] = vec[nsize - 1] / _A(nsize - 1,nsize - 1);
/* answer needs sorting */