gpt4 book ai didi

c - 矩阵 : Inverse always null

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:36 28 4
gpt4 key购买 nike

我的矩阵的逆总是显示 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");
}
}

最佳答案

您的代码有几个问题,但主要错误是您将错误的参数传递给

cofactor(A,k);

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

你应该使用矩阵的顺序,n:

cofactor(A, n);

一般来说,您应该使用更一致的命名法。在main中,矩阵的顺序是n,在determinant中是k,在cofactor 您使用浮点变量 f,而在 transpose 中,您使用浮点变量 r。更让人困惑的是,n 在这里是一个代表行列式的 float 。我建议您使用整数 n 作为顺序,局部整数 ijk 作为循环变量 – C99 允许您仅为循环范围定义它们,例如for (int i = 0; ...) – 以及 float 的或多或少有意义的名称;行列式的 det 很好。

进一步的建议:

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

关于c - 矩阵 : Inverse always null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41020961/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com