矩阵的秩
在线性代数中,一个矩阵A的列秩是A的线性独立的纵列的极大数,通常表示为r(A),rk(A)或rank A。一个矩阵A的列秩是A的线性独立的纵列的极大数目。类似地,行秩是A的线性无关的横行的极大数目。即如果把矩阵看成一个个行向量或者列向量,秩就是这些行向量或者列向量的秩,也就是极大无关组中所含向量的个数。
相关定理
定理:矩阵的行秩,列秩,秩都相等。
定理:初等变换不改变矩阵的秩。
定理:如果A可逆,则r(AB)=r(B),r(BA)=r(B)。
定理:矩阵的乘积的秩Rab<=min{Ra,Rb};
引理:设矩阵A=(aij)sxn的列秩等于A的列数n,则A的列秩,秩都等于n。
当r(A)<=n-2时,最高阶非零子式的阶数<=n-2,任何n-1阶子式均为零,而伴随阵中的各元素就是n-1阶子式再加上个正负号,所以伴随阵为0矩阵。
当r(A)<=n-1时,最高阶非零子式的阶数<=n-1,所以n-1阶子式有可能不为零,所以伴随阵有可能非零(等号成立时伴随阵必为非零)。
代码块
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 5 //表示行数
#define M 9 //表示列数
void main()
{
float a[N][M]={{0,4,5,0,0,1,1,1,0},{-5,0,2,0,1,0,1,0,3},{7,2,0,0,-4,0,4,1,0},{-3,1,0,0,0,0,0,0,1},{2,-3,0,0,3,1,0,4,0}};
int i,j,k;
float temp;
int r=0,d=0; //r表示秩,d表示当前正在哪一行。
for(i=0;i<M;i++)
{
k=d; /*a[i][i] a[i+1][i] ... a[n][i]中绝对值最大的行位置*/
for(j=d+1;j<N;j++)
if(fabs(a[k][i])<fabs(a[j][i]))
k=j;
if(k!=d) /*交换第i行和第k行,行列式该变号*/
{
for(j=i;j<M;j++)
{
temp=a[d][j];
a[d][j]=a[k][j];
a[k][j]=temp;
}
}
if(a[d][i]==0) /*当a[i][i]为零是时,行列式为零*/
{
continue;
}
else
{
r=r+1;
for(j=0;j<N;j++)
{
if(j!=d)
{
temp=-1*a[j][i]/a[d][i];
for(k=i;k<M;k++)
a[j][k]=a[j][k]+temp*a[d][k];
}
}
temp=a[d][i];
for(j=i;j<M;j++)
a[d][j]=a[d][j]/temp;
}
d=d+1;
if(d>=N)
break;
}
printf("矩阵行的最简式为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%.4f\t",a[i][j]);
printf("\n");
}
printf("\n矩阵的秩R(A)=%d\n",r);
}
注:请在C语言编译环境下运行