计算逆矩阵?

标签 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;
}

最佳答案

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

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

不过,您只为一个 float 分配空间。这可能是崩溃的一个可能原因。

您也从未真正释放过内存。

关于计算逆矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4811290/

相关文章:

c - 在 C 中重定向输入(文本文件)

两个printf语句的比较

c++ - 函数内部的函数声明是否有用?

android - 矩阵坐标中的点

android - 将矩阵图像定位在 ImageView 的中心

MATLAB:拆分数组

c - 结构成员和指针对齐

c - C 中的 fread 和 fwrite 链表

c - 在C中使用多线程做矩阵乘法

java - 如何初始化 Matrix 对象