#include <math.h> #include "..\CommonFiles\nrutil.h" #define TINY 1.0e-20; /* Crout算法 ** indx为输出向量,保存部分主元法而改变了行的行排列顺序 ** 输出向量d为±1,表示行交换次数为偶数还是为奇数 */ void ludcmp(float **a, int n, int *indx, float *d) { int i,imax,j,k; float big,dum,sum,temp; float *vv; /* 用于保存每行的内含比例因子*/ vv=vector(1,n); *d=1.0; for (i=1; i<=n; i++) { /* 按行循环,求内含比例因子(每一行最大元素的倒数)*/ big=0.0; for (j=1; j<=n; j++) if ((temp=fabs(a[i][j])) > big) big=temp; if (big == 0.0) nrerror("Singular matrix in routine ludcmp"); vv[i]=1.0/big; } for (j=1; j<=n; j++) { /* 外层列循环*/ for (i=1; i<j; i++) { /* 上三角部分*/ sum=a[i][j]; for (k=1; k<i; k++) sum -= a[i][k]*a[k][j]; a[i][j]=sum; } big=0.0; /* 初始化最大主元*/ for (i=j; i<=n; i++) { /* i >= j 下三角部分*/ sum=a[i][j]; for (k=1; k<j; k++) sum -= a[i][k]*a[k][j]; a[i][j]=sum; if ( (dum=vv[i]*fabs(sum)) >= big) { big=dum; imax=i; } } if (j != imax) { /* 是否进行交换?*/ for (k=1; k<=n; k++) { dum=a[imax][k]; a[imax][k]=a[j][k]; a[j][k]=dum; } *d = -(*d); /* 改变d的奇偶性*/ vv[imax]=vv[j]; } indx[j]=imax; if (a[j][j] == 0.0) a[j][j]=TINY; if (j != n) { dum=1.0/(a[j][j]); for (i=j+1; i<=n; i++) a[i][j] *= dum; } } free_vector(vv,1,n); } #undef TINY
原文:http://www.cnblogs.com/dLong/p/4477945.html