107#define SWAP(a,b) {temp=(a);(a)=(b);(b)=temp;}
116 v=(
int *)malloc((
size_t) ((nh-nl+1+
NR_END)*
sizeof(
int)));
122double **
nr_matrix(
long nrl,
long nrh,
long ncl,
long nch)
125 long i, nrow=nrh-nrl+1, ncol=nch-ncl+1;
129 m=(
double **) malloc((
size_t)((nrow+
NR_END)*
sizeof(
double*)));
133 fprintf(stderr,
"Memory failure in routine 'nr_matrix'.\n");
141 m[nrl] = (
double *) malloc((
size_t)((nrow*ncol+
NR_END)*
sizeof(
double)));
144 fprintf(stderr,
"Memory failure in routine 'matrix'\n");
151 for (
i=nrl+1;
i<=nrh;
i++) m[
i]=m[
i-1]+ncol;
160 free( (
char *) (v+nl-
NR_END));
167 free((
char *) (m[nrl]+ncl-
NR_END));
168 free((
char *) (m+nrl-
NR_END));
182 int *indxc, *indxr, *ipiv;
183 int i, icol = 0, irow = 0, j, k, l, ll;
184 double big, dum, pivinv, temp;
186 int bexists = ((m != 0) || (b == 0));
192 for (j=1;j<=n;j++) ipiv[j] = 0;
203 if (fabs(a[j][k]) >= big)
231 for (l=1;l<=n;l++)
SWAP(a[irow][l],a[icol][l])
232 if (bexists)
for (l=1;l<=m;l++)
SWAP(b[irow][l],b[icol][l])
236 if (fabs(a[icol][icol]) < 1E-8) {
242 pivinv = 1.0/a[icol][icol];
244 for (l=1;l<=n;l++) a[icol][l] *= pivinv;
245 if (bexists)
for (l=1;l<=m;l++) b[icol][l] *= pivinv;
246 for (ll=1;ll<=n;ll++)
251 for (l=1;l<=n;l++) a[ll][l] -= a[icol][l]*dum;
252 if (bexists)
for (l=1;l<=m;l++) b[ll][l] -= b[icol][l]*dum;
263 if (indxr[l] != indxc[l])
265 SWAP(a[k][indxr[l]],a[k][indxc[l]])
282 if ((orig==0)||(copy==0)||(n==0))
return;
286 copy[
i][j] = orig[
i][j];
289void nr_multmat(
double **m1,
int n,
double **m2,
double **prod)
293 if ((m1==0)||(m2==0)||(prod==0)||(n==0))
return;
299 for(k=1;k<=n;k++) prod[
i][j] += m1[
i][k]*m2[k][j];
313 printf(
"% 9.4f ", a[
i][j]);
323 double **mat1, **mat2, **mat3;
325 int loop,
i, j, n = 20;
326 long maxlong = RAND_MAX;
329 invmaxlong = 1.0/(double)maxlong;
336 for(loop=0;loop<maxloop;loop++)
341 mat1[
i][j] = 2.0 - 4.0*invmaxlong*(
double) rand();
343 printf(
"Original matrix:\n");
350 if (
i) printf(
"Singular matrix.\n");
352 printf(
"Inverted matrix:\n");
357 printf(
"Original multiplied by inverse:\n");
362 if (loop < maxloop-1) ;
double ** nr_matrix(long nrl, long nrh, long ncl, long nch)
void nr_multmat(double **m1, int n, double **m2, double **prod)
int nr_gaussj(double **a, int n, double **b, int m)
void nr_copymat(double **orig, int n, double **copy)
void nr_free_ivector(int *v, long nl)
int * nr_ivector(long nl, long nh)
void nr_free_matrix(double **m, long nrl, long nrh, long ncl, long nch)
void nr_printmat(double **a, int n)