计算逆矩阵?

时间:2011-01-26 23:21:41

标签: c matrix

为什么我会因此而崩溃,我哪里错了!? :(

#include<stdio.h>
#include<conio.h>
#include<alloc.h>

const volatile max=15;

int    read(float[][max],float[][max]);
void   compute1(float[][max],float[][max],float[][max],int,int,int,float);
float  compute2(float[][max],int);
void   display(float[][max],float[][max],int,float);

int    main(){

    float  num[max][max],g[max][max],v[max][max],a[max][max];
    int dn,u;
    float det;
    int register i,j;

    dn=read(num,a);
    det=compute2(num,dn);

    for(i=0;i<dn;i++)
        for(j=0;j<dn;j++){
            compute1(a,g,v,dn,i,j,det);
        }

    display(a,v,dn,det);
    getch();

    return 0;
}

//****************************************************************************
int read(float num[][max],float a[][max]){

    int dn;
    clrscr();
    int register i,j;

    printf("\nenter degree of matrix:");

    scanf("%d",&dn);
    clrscr();

    for(i=0;i<dn;i++){
        printf("\n\n\nenter arguments of row[%d]:\n\n",i);

        for(j=0;j<dn;j++){
            scanf("%f",*(num+i)+j);

            *(*(a+i)+j)=*(*(num+i)+j);
        }
    }
    return dn;
}


//****************************************************************************
void   display(float c[][max],float inv[][max],int dn,float det){
    int register i,j;
    clrscr();

    printf("\n\n\n\n\n\t\t\t    --ORIGINAL MATRIX--\n");

    for(i=0;i<dn;i++){
        printf("\n\t\t");

        for(j=0;j<dn;j++)
        printf("%10.3f",c[i][j]);
    }

    printf("\n\n\n\t\t\t      --INVERSE MATRIX--\n");

    for(i=0;i<dn;i++){
        printf("\n\t\t");

        for(j=0;j<dn;j++)
        printf("%10.6f  ",inv[i][j]);
    }

    printf("\n\n\n\t\tعؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ؟");
    printf("\n\t\t³ determinan of matrix= %19.7f  ³ ",det);
    printf("\n\t\tہؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤظ");
}


//****************************************************************************
void compute1(float g[][max],float v[][max],float inv1[][max],int dn,int r,int c,float e){
    int col=0,row=0,add=r+c,y;
    float y1=1;

    if(add%2)
        y1=-1;

    int register i,j;

    for(i=0;i<dn-1;i++){
        if(i==r)
            row=1;

        col=0;

        for(j=0;j<dn-1;j++){
            if(j==c)
                col=1;

            v[i][j]=g[i+row][j+col];
        }
    }

    inv1[c][r]=y1*compute2(v,dn-1)/e;
}


//****************************************************************************
float compute2(float c[][max],int s){
    float *h=(float*)malloc(sizeof(float)),h1=1;int y=s-1,k=s;
    int register i,j;

    while(y>0){
        for(i=1;i<k;i++){
            if(c[y][y]!=0)
                h[i-1]=c[y-i][y]/c[y][y];
            else{
                for(j=0;j<s;j++)
                    c[y][j]+=c[y-i][j];
                h[i-1]=c[y-i][y]/c[y][y];
            }
        }

    y--;
    k--;

    for(i=0;i<k;i++)
        for(j=s-1;j>=0;j--)
            c[y-i][j]=c[y-i][j]-h[i]*c[y+1][j];
    }

    for(i=0;i<s;i++)
        h1*=c[i][i];

    return h1;
}

2 个答案:

答案 0 :(得分:3)

您的代码存在很多问题。在compute2中,你是为一行分配内存吗?

   float *h=(float*)malloc(sizeof(float)),h1=1;int y=s-1,k=s;

你只为一个花车分配空间。这可能是崩溃的可能来源。

你也从未实际释放内存。

答案 1 :(得分:0)

您需要使用调试和日志记录工具,而不是注意代码。我们甚至不知道你的崩溃是什么。

然而,这是一个可疑的地方

    if(c[y][y]!=0)
        h[i-1]=c[y-i][y]/c[y][y];
    else{
        for(j=0;j<s;j++)
            c[y][j]+=c[y-i][j];
        h[i-1]=c[y-i][y]/c[y][y];
    }

在if ...的两个分支中,你除以c[y][y]。你知道它何时进入零else。除非for循环改变它,否则你将除以零。所以我建议你测试一下。