编程求解行列式的值

    计算行列式最基本的方法就是将行列式化成上三角或者下三角的形式,然后将主对角线上的元素逐个相乘,便能得到整个行列式的值det(A)。根据这一思想,可以用程序语言来模拟这个过程,设该行列式的阶数为n。
    由于无论是上三角或者下三角形式的行列式,它的值都只与主对角线上的元素有关。这样我们遍历所有的a[i][i],i=1,2,...,n。如果a[i][i]=0,那么从行数j>i的一行中找出一个不为0的数a[j][i],并把第j行的所有元素与第i行的所有元素互换,符号位sign++;如果找不到,则行列式值为0。接下来用a[i][i]将其之后的元素化为0(下三角形式),循环n次之后主对角线上的乘积便是整个行列式的值。
#include <cstdio>
#include 
<cmath>

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

struct mat{
    
int n,m;
    
double data[MAXN][MAXN];
}
;
double det(const mat &a){
    
int i,j,k,sign=0;
    
double b[MAXN][MAXN],ret=1,t;
    
if(a.n!=a.m) return 0;
    
for(i=0;i<a.n;i++)
        
for(j=0;j<a.m;j++)
            b[i][j]
=a.data[i][j];
    
for(i=0;i<a.n;i++){//行标+列标
        if(zero(b[i][i])){
            
for(j=i+1;j<a.n;j++)//行标
                if(!zero(b[j][i]))
                    
break;
            
if(j==a.n) return 0;
            
for(k=i;k<a.n;k++)//列标
                t=b[i][k],b[i][k]=b[j][k],b[j][k]=t;
            sign
++;
        }

        ret
*=b[i][i];
        
for(k=i+1;k<a.n;k++)//列标
            b[i][k]/=b[i][i];
        
for(j=i+1;j<a.n;j++)//行标
            for(k=i+1;k<a.n;k++)//列标
                b[j][k]-=b[j][i]*b[i][k];
    }

    
if(sign & 1) ret=-ret;
    
return ret;
}

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

    
return 0;
}

posted on 2009-06-11 14:21 极限定律 阅读(1387) 评论(0)  编辑 收藏 引用 所属分类: ACM/ICPC


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


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

导航

统计

常用链接

留言簿(10)

随笔分类

随笔档案

友情链接

搜索

最新评论

阅读排行榜

评论排行榜