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
|