求解矩阵的秩相关算法(C语言)

本文介绍了矩阵的秩在线性代数中的定义,包括列秩和行秩,并探讨了相关定理,如矩阵秩的不变性。文章还提供了在C语言中计算矩阵秩的代码示例。

矩阵的秩

在线性代数中,一个矩阵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语言编译环境下运行

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值