矩阵的反转总是显示为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");
}
}
答案 0 :(得分:2)
您的代码存在一些问题,但主要错误是您将错误的参数传递给
cofactor(A,k);
这里,k
是一个循环变量,它具有在进行三角分解的代码中使用后的值。 (您可以看到此值为1,因为只打印了矩阵的一个条目。)
您应该使用矩阵的顺序n
:
cofactor(A, n);
通常,您应该使用更一致的术语。在main
中,矩阵的顺序为n
,determinant
k
,cofactor
中使用浮点变量f
{1}}在transpose
中,您使用浮点变量r
。为了增加混淆,n
是一个代表行列式的浮点数。我建议你使用整数n
作为顺序,局部整数i
,j
和k
作为循环变量 - C99允许你只为它的范围定义它们循环,例如for (int i = 0; ...)
- 以及浮点数的或多或少有意义的名称;决定因素的det
是好的。
进一步的建议:
transpose
的一部分。相反,transpose
应填写从main
传入的矩阵,然后main
应打印该矩阵。:)