| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | #include <math.h>#define NRANSI#include "nrutil.h"//#define REAL float#define SWAP(a,b) {temp=(a);(a)=(b);(b)=temp;}void gaussj(REAL **a, int n, REAL **b, int m){	int *indxc,*indxr,*ipiv;	int i,icol,irow,j,k,l,ll;	REAL big,dum,pivinv,temp;	indxc=ivector(1,n);	indxr=ivector(1,n);	ipiv=ivector(1,n);	for (j=1;j<=n;j++) ipiv[j]=0;	for (i=1;i<=n;i++) {		big=0.0;		for (j=1;j<=n;j++)			if (ipiv[j] != 1)				for (k=1;k<=n;k++) {					if (ipiv[k] == 0) {						if (fabs(a[j][k]) >= big) {							big=fabs(a[j][k]);							irow=j;							icol=k;						}					} else if (ipiv[k] > 1) nrerror("gaussj: Singular Matrix-1");				}		++(ipiv[icol]);		if (irow != icol) {			for (l=1;l<=n;l++) SWAP(a[irow][l],a[icol][l])			for (l=1;l<=m;l++) SWAP(b[irow][l],b[icol][l])		}		indxr[i]=irow;		indxc[i]=icol;		if (a[icol][icol] == 0.0) nrerror("gaussj: Singular Matrix-2");		pivinv=1.0/a[icol][icol];		a[icol][icol]=1.0;		for (l=1;l<=n;l++) a[icol][l] *= pivinv;		for (l=1;l<=m;l++) b[icol][l] *= pivinv;		for (ll=1;ll<=n;ll++)			if (ll != icol) {				dum=a[ll][icol];				a[ll][icol]=0.0;				for (l=1;l<=n;l++) a[ll][l] -= a[icol][l]*dum;				for (l=1;l<=m;l++) b[ll][l] -= b[icol][l]*dum;			}	}	for (l=n;l>=1;l--) {		if (indxr[l] != indxc[l])			for (k=1;k<=n;k++)				SWAP(a[k][indxr[l]],a[k][indxc[l]]);	}	free_ivector(ipiv,1,n);	free_ivector(indxr,1,n);	free_ivector(indxc,1,n);}#undef SWAP#undef NRANSI
 |