矩阵:反向始终为空

时间:2016-12-07 15:10:30

标签: c matrix

矩阵的反转总是显示为0,我不明白为什么。谢谢你提前。 4个功能: -main:用户输入矩阵,显示结果(矩阵,行列式,LU因子分解和逆矩阵)。

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

float determinant(float[20][20],float);
void cofactor(float[20][20],float);
void transpose(float[20][20],float[20][20],float);

void main() 
{
    float A[20][20]= {0},L[20][20]= {0}, U[20][20];
    float B[20]= {0}, X[20]= {0},Y[20]= {0};
    int i,j,k,n;
    printf("Enter the order of square matrix: ");
    scanf("%d",&n);
    printf("\nEntrer les elements de la matrice A:\n");
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("Entrer l'element A[%d][%d] : ", i,j);
            scanf("%f",&A[i][j]);
        }
    }
    printf("\nEntrer les termes de la matrice B\n");
    for(i=0; i<n; i++)
    {
        printf("B[%d]",i);
        scanf("%f",&B[i]);
    }
    for(j=0; j<n; j++)
    {
        for(i=0; i<n; i++)
        {
            if(i<=j)
            {
                U[i][j]=A[i][j];
                for(k=0; k<i-1; k++)
                    U[i][j]-=L[i][k]*U[k][j];
                if(i==j)
                    L[i][j]=1;
                else
                    L[i][j]=0;
            }
            else
            {
                L[i][j]=A[i][j];
                for(k=0; k<=j-1; k++)
                    L[i][j]-=L[i][k]*U[k][j];
                L[i][j]/=U[j][j];
                U[i][j]=0;
            }
        }
    }
    printf("[L]: \n");
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
            printf("%9.3f",L[i][j]);
        printf("\n");
    }
    printf("\n\n[U]: \n");
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
            printf("%9.3f",U[i][j]);
        printf("\n");
    }
   //Y pour calculer X
    for(i=0; i<n; i++)
    {
        Y[i]=B[i];
        for(j=0; j<i; j++)
        {
            Y[i]-=L[i][j]*Y[j];
        }
    }
    for(i=0; i<n; i++)
    {
        printf("%9.3f",Y[i]);
    }
    for(i=n-1; i>=0; i--)
    {
        X[i]= Y[i];
        for(j=i+1; j<n; j++)
        {
            X[i]-=U[i][j]*X[j];
        }
        X[i]/=U[i][i];
    }
    printf("\n\n[X]: \n");
    for(i=0; i<n; i++)
    {
        printf("%9.3f",X[i]);
    }
    printf("\n\nLe determinant de la matrice A est = %f",n);
  if (n==0)
   printf("\nCette matrice n'a pas d'inverse!\n");
  else {
   cofactor(A,k);
  }

getch();
}

float determinant(float a[20][20],float k)
{
  float s=1,det=0,b[20][20];
  int i,j,m,n,c;
  if (k==1)
    {
     return (a[0][0]);
    }
  else
    {
     det=0;
     for (c=0;c<k;c++)
       {
        m=0;
        n=0;
        for (i=0;i<k;i++)
          {
            for (j=0;j<k;j++)
              {
                b[i][j]=0;
                if (i != 0 && j != c)
                 {
                   b[m][n]=a[i][j];
                   if (n<(k-2))
                    n++;
                   else
                    {
                     n=0;
                     m++;
                     }
                   }
               }
             }
          det=det + s * (a[0][c] * determinant(b,k-1));
          s=-1 * s;
          }
    }

    return (det);
}

void cofactor(float num[20][20],float f) //fonction which will calculate the cofactof of matrix
{
 float b[20][20],fac[20][20];
 int p,q,m,n,i,j;
 for (q=0;q<f;q++)
 {
   for (p=0;p<f;p++)
    {
     m=0;
     n=0;
     for (i=0;i<f;i++)
     {
       for (j=0;j<f;j++)
        {
          if (i != q && j != p)
          {
            b[m][n]=num[i][j];
            if (n<(f-2))
             n++;
            else
             {
               n=0;
               m++;
               }
            }
        }
      }
      fac[q][p]=pow(-1,q + p) * determinant(b,f-1);
    }
  }
  transpose(num,fac,f);
}
/*Finding transpose of matrix*/
void transpose(float num[20][20],float fac[20][20],float r)
{
  int i,j;
  float b[20][20],inverse[20][20],n;

  for (i=0;i<r;i++)
    {
     for (j=0;j<r;j++)
       {
         b[i][j]=fac[j][i];
        }
    }
  n=determinant(num,r);
  for (i=0;i<r;i++)
    {
     for (j=0;j<r;j++)
       {
        inverse[i][j]=b[i][j] / n;
        }
    }
   printf("\n\n\nThe inverse of matrix is : \n");

   for (i=0;i<r;i++)
    {
     for (j=0;j<r;j++)
       {
         printf("\t%f",inverse[i][j]); //show inverse of the matrix
        }
    printf("\n");
     }
}

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题,但主要错误是您将错误的参数传递给

cofactor(A,k);

这里,k是一个循环变量,它具有在进行三角分解的代码中使用后的值。 (您可以看到此值为1,因为只打印了矩阵的一个条目。)

您应该使用矩阵的顺序n

cofactor(A, n);

通常,您应该使用更一致的术语。在main中,矩阵的顺序为ndeterminant kcofactor中使用浮点变量f {1}}在transpose中,您使用浮点变量r。为了增加混淆,n是一个代表行列式的浮点数。我建议你使用整数n作为顺序,局部整数ijk作为循环变量 - C99允许你只为它的范围定义它们循环,例如for (int i = 0; ...) - 以及浮点数的或多或少有意义的名称;决定因素的det是好的。

进一步的建议:

  • 每次都不要写明确的循环来打印矩阵;编写一个函数来打印矩阵和一个函数来代替打印矢量并调用它们。
  • 从打印中分离计算。例如,打印反转的代码不应该是(命名错误的?)transpose的一部分。相反,transpose应填写从main传入的矩阵,然后main应打印该矩阵。
  • 理想情况下,三角分解和求解方程也应该是函数。体验组织良好的代码的乐趣。 :)