矩阵求逆

矩阵求逆

    还是利用最基本的单位阵求逆矩阵的方法,消元的方法与高斯消元法类似。
#include  < cstdio >
#include 
< cmath >

#define  MAXN 100
#define  eps 1e-9
#define  zero(x) (fabs(x)<eps)

struct  mat {
    
int n,m;
    
double data[MAXN][MAXN];
}
;

int  inverse(mat  & a) {
    
double t;
    
int i,j,k,is[MAXN],js[MAXN];
    
if(a.n!=a.m) return 0;
    
for(k=0;k<a.n;k++){
        
for(t=0,i=k;i<a.n;i++)
            
for(j=k;j<a.n;j++)
                
if(fabs(a.data[i][j])>t)
                    t
=fabs(a.data[is[k]=i][js[k]=j]);
        
if(zero(t)) return 0;
        
if(is[k]!=k)
            
for(j=0;j<a.n;j++)
                t
=a.data[k][j],a.data[k][j]=a.data[is[k]][j],a.data[is[k]][j]=t;
        
if(js[k]!=k)
            
for(i=0;i<a.n;i++)
                t
=a.data[i][k],a.data[i][k]=a.data[i][js[k]],a.data[i][js[k]]=t;
        a.data[k][k]
=1/a.data[k][k];
        
for(j=0;j<a.n;j++)
            
if(j!=k)
                a.data[k][j]
*=a.data[k][k];
        
for(i=0;i<a.n;i++)
            
if(i!=k)
                
for(j=0;j<a.n;j++)
                    
if(j!=k)
                        a.data[i][j]
-=a.data[i][k]*a.data[k][j];
        
for(i=0;i<a.n;i++)
            
if(i!=k)
                a.data[i][k]
*=-a.data[k][k];
    }

    
for(k=a.n-1;k>=0;k--){
        
for(j=0;j<a.n;j++)
            
if(js[k]!=k)
                t
=a.data[k][j],a.data[k][j]=a.data[js[k]][j],a.data[js[k]][j]=t;
        
for(i=0;i<a.n;i++)
            
if(is[k]!=k)
                t
=a.data[i][k],a.data[i][k]=a.data[i][is[k]],a.data[i][is[k]]=t;
    }

    
return 1;
}

int  main() {
    mat a;
    
int i,j,n;
    
while(scanf("%d",&n),n){
        a.m
=a.n=n;
        
for(i=0;i<n;i++)
            
for(j=0;j<n;j++)
                scanf(
"%lf",&a.data[i][j]);
        
if(inverse(a))
            
for(i=0;i<n;i++){
                
for(j=0;j<n;j++)
                    printf(
"%.2lf ",zero(a.data[i][j]) ? 0.00 : a.data[i][j]);
                printf(
"\n");
            }

        
else
            puts(
"NO");
    }

    
return 0;
}

你可能感兴趣的:(矩阵求逆)