/*注意:re == row_element;ce == column_element*/
#include <stdio.h>
#include <math.h>
void Matrix_Simplify(void);
unsigned char Matrix_Rank(void);
float matrix[100][100];
unsigned char re=0,ce=0;
unsigned int row,column;
main()
{
unsigned char a,b;
printf("Please enter the size of the matrix(row)(column)\n");
scanf("%d %d",&row,&column);
for(a=0;a<row;a++)
{
printf("Please enter the elements on line %d, separated by spaces.\n",a+1);
for(b=0;b<column;b++)
{
scanf("%f",&matrix[a][b]);
}
}
/*输出初始矩阵*/
printf("\n The matrix you entered:\n\n");
for(a=0;a<row;a++)
{
for(b=0;b<column;b++)
printf("%8.4g",matrix[a][b]);
printf("\n\n");
}
/*把矩阵化为行最简型*/
for(ce=0;ce<column;)
{
/*把aii的值都转化为非0值(寻找该列自aii以下首个非零元所在的行与第i行互换)*/
if(matrix[re][ce]==0)
{
for(a=re;a<row;a++)
{
if(matrix[a][ce]!=0)
break;
}
/*如果aii及以下元素都为0,则此列不做处理,进行下一列的转化*/
if(a==row)
ce++;
else
{
for(b=0;b<column;b++)
{
matrix[99][b]=matrix[a][b];
matrix[a][b]=matrix[re][b];
matrix[re][b]=matrix[99][b];
}
Matrix_Simplify();
}
}
else
{
Matrix_Simplify();
}
}
/*输出转化后的矩阵*/
printf("Its row simplest matrix form:\n\n");
for(a=0;a<row;a++)
{
for(b=0;b<column;b++)
{
if(fabs(matrix[a][b])<0.0001)
matrix[a][b]=0;
printf("%8.4g",matrix[a][b]);
}
printf("\n\n");
}
printf("\n\n Rank of the matrix:%d\n",Matrix_Rank());
}
/*对矩阵的转化过程*/
void Matrix_Simplify(void)//第一行第一个元素已经是非零元素。
{
int i,j;
float n;
/*使元素aii都化为1(第i行同乘1/aii)*/
n=1/matrix[re][ce];
for(j=0;j<column;j++)
{
matrix[re][j]=n*matrix[re][j];
}
/*把非零行的首个元素1所在的列中位于1之上的元素都化为0*/
for(i=0;i<re;i++)
{
n=-matrix[i][ce]/matrix[re][ce];
for(j=0;j<column;j++)
{
matrix[i][j]=matrix[i][j]+n*matrix[re][j];
}
}
/*把非零行的首个元素1所在的列中位于1之下的元素都化为0*/
for(i=re+1;i<row;i++)
{
n=-matrix[i][ce]/matrix[re][ce];
for(j=0;j<column;j++)
{
matrix[i][j]=matrix[i][j]+n*matrix[re][j];
}
}
re++;
ce++;
}
/*求矩阵的秩*/
unsigned char Matrix_Rank(void)
{
unsigned char i,j;
for(i=0;i<row;i++)
{
/*计算有多少个非零行即为矩阵的秩*/
for(j=0;j<column;j++)
{
if(matrix[i][j]!=0)
break;
}
if(j==column)
break;
}
return i;
}
比如下面的例子: