Listing 1: The matrix inversion function
/* =================================================================== */
/* augvrt - inverts an nr by nc matrix a, and computes its determinant */
/* =================================================================== */
# if defined(__STDC__) || defined(__PROTO__)
double augvrt(double *a, int nr, int nc, int nd)
# else
double augvrt(a, nr, nc, nd)
double *a;
int nr, nc, nd;
# endif
/* ------------------------------------------------------------ */
/*- Explanation of Calling Sequence Parameters */
/* ------------------------------------------------------------ */
/*- nr - no. rows in a */
/*- nc - no. cols in a (nc >= nr) */
/*- nd - order of matrix that holds matrix a (nd >= nc) */
/*- (matrix to be inverted can be imbedded) */
/*- */
/*- if x = a-inv*b is being solved, there will be nc-nr */
/*- solution vectors in x */
/* ------------------------------------------------------------ */
{
double det_val = 1.0; /* determinant value */
register
int i, j, k;
double r;
int ii, ij, ir, jr, ki, kj;
ii = 0; /* index of diagonal */
ir = 0; /* index of row */
for (i = 0; i < nr; ++i, ir += nd, ii = ir + i)
{
det_val *= a[ii]; /* new value of determinant */
/* ------------------------------------ */
/* if value is zero, might be underflow */
/* ------------------------------------ */
if (det_val == 0.0)
{
if (a[ii] == 0.0)
{
break; /* error - exit now */
}
else /* must be underflow */
{
det_val = 1.0e-30;
}
}
/* --------------- */
/* Calculate Pivot */
/* --------------- */
r = 1.0 / a[ii];
a[ii] = 1.0;
ij = ir; /* index of pivot row */
for (j = 0; j < nc; ++j)
{
a[ij] = r * a[ij];
++ij; /* index of next row element */
}
ki = i; /* index of ith column */
jr = 0; /* index of jth row */
for (k = 0; k < nr; ++k, ki += nd, jr += nd)
{
if (i != k && a[ki] != 0.0)
{
r = a[ki]; /* pivot target */
a[ki] = 0.0;
ij = ir; /* index of pivot row */
kj = jr; /* index of jth row */
/* -------------------------------------------- */
/* subtract multiples of pivot row from jth row */
/* -------------------------------------------- */
for (j = 0; j < nc; ++j)
{
a[kj] -= r * a[ij];
++ij, ++kj;
}
}
}
}
return(det_val);
} /* augvrt */