www.pudn.com > gauss_xxx.rar > Gauss.cpp


#include "stdafx.h" 
#include "memory.h" 
 
#define _FABS(x) (x>0?x:(-x)) 
 
bool guass(double *g, double *b, double *x, int n)  
{  
	int i,j,k,p;  
	int *flag;  
	double l;  
	flag = new int[n]; 
	if( !flag )return false; 
	memset(flag,0,sizeof(int)*n); 
	 
	//按列循环 
	for (i=0;i1e-8) 
			{ 
				if(p==-1) p=j;  
				else if( _FABS((g[p*n+i]))<=_FABS((g[j*n+i])) ) p=j;  
			} 
		}    
		 
		if (p==-1) return false;  
		if( _FABS((g[p*n+i]))<1e-8 )return false; 
 
		//flag[p]为零,表示p行还没有主元,为1+i,表示此行的主元是在i列上 
		flag[p]=1+i;  
		 
		//逐行消去第i列系数元 
		for (j=0;j1e-8 )return false; 
			else if( i!=j && _FABS((m[i*n+j]))>1e-8 )return false; 
		} 
	} 
 
	return true; 
} 
 
//求逆矩阵(采用初等变换,高斯列主消元法) 
bool matrix_reverse(double *m, int n, double *r) 
{ 
	int i,j,k,p;  
	int *flag;  
	double l;  
	double *tm; 
 
	flag = new int[n]; 
	tm = new double[n*n]; 
	if( !flag || !tm ) 
	{ 
		if( tm )delete[] tm; 
		if( flag )delete[] flag; 
		return false; 
	} 
 
	memset(flag,0,sizeof(int)*n); 
	memcpy(tm,m,sizeof(double)*n*n); 
 
	//将r置为单位方阵 
	matrix_toIdentity(r,4); 
	 
	//按列循环 
	for(i=0;i1e-8) 
			{ 
				if(p==-1) p=j;  
				else if( _FABS((m[p*n+i]))<_FABS((m[j*n+i])) ) p=j;  
			} 
		}    
		 
		if( p==-1 ) return false; 
		if( _FABS((m[p*n+i]))<1e-8 )return false; 
 
		//flag[p]为零,表示p行还没有主元,为1+i,表示此行的主元是在i列上 
		flag[p]=1+i;  
		 
		//逐行消去第i列系数元(不含拥有列主元的那一行) 
		for(j=0;j1e-8) 
			{ 
				if(p==-1) p=j;  
				else if( _FABS((m[p*n+i]))<_FABS((m[j*n+i])) ) p=j;  
			} 
		}    
		 
		if( p==-1 ) return false; 
		if( _FABS((m[p*n+i]))<1e-8 )return false; 
 
		//flag[p]为零,表示p行还没有主元,为1+i,表示此行的主元是在i列上 
		flag[p]=1+i;  
		 
		//逐行消去第i列系数元(不含拥有列主元的那一行) 
		for(j=0;j=n )return false; 
 
		// 与当前行置换 
		if( j==i )continue; 
		 
		for(k=0; k