矩阵求逆

    还是利用最基本的单位阵求逆矩阵的方法,消元的方法与高斯消元法类似。
#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;
}

posted on 2009-06-12 00:08 极限定律 阅读(756) 评论(0)  编辑 收藏 引用 所属分类: ACM/ICPC


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(10)

随笔分类

随笔档案

友情链接

搜索

最新评论

阅读排行榜

评论排行榜