C语言关于矩阵的一些运算(转置,求逆,乘法)

C语言关于矩阵的一些运算(转置,求逆,乘法)

1.矩阵的转置 Transpose(例子,以3*4的矩阵为例,其他修改数字即可)

void Transpose(int Mat[3][4], int newMat[4][3])//Mat是要进行转置的,newMat是转置后的
{
	for (int i = 0; i < 4; i++)//循环写入newMat
	{
		for (int j = 0; j < 3; j++)
		{
			newMat[j][i] = Mat[i][j];//置换
		}
	}
}
//测试
int main()
{
  int Mat[3][4]={1,2,3,4,7,8,9,4,5,6,3,4};
  int newMat[4][3];
  Transpose(Mat, newMat);
  for(int i=0;i<4;i++)
    for(int j=0;j<3;j++)
       printf("%d,",newMat[i][j]);
    printf("\n");
  return 0;
}

2.矩阵的逆 (高斯消元法,效率高)

#define N 3
void Gauss(int A[][N], float B[][N], int n)//这里的n指的是n*n的方阵中的n
{
	int i, j, k;
	float max, temp;
	float t[N][N];                //临时矩阵
								  //将A矩阵存放在临时矩阵t[n][n]中
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			t[i][j] = A[i][j];
		}
	}
	//初始化B矩阵为单位阵
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			B[i][j] = (i == j) ? (float)1 : 0;
		}
	}
	for (i = 0; i < n; i++)
	{
		//寻找主元
		max = t[i][i];
		k = i;
		for (j = i + 1; j < n; j++)
		{
			if (fabs(t[j][i]) > fabs(max))
			{
				max = t[j][i];
				k = j;
			}
		}
		//如果主元所在行不是第i行,进行行交换
		if (k != i)
		{
			for (j = 0; j < n; j++)
			{
				temp = t[i][j];
				t[i][j] = t[k][j];
				t[k][j] = temp;
				//B伴随交换
				temp = B[i][j];
				B[i][j] = B[k][j];
				B[k][j] = temp;
			}
		}
		//判断主元是否为0, 若是, 则矩阵A不是满秩矩阵,不存在逆矩阵
		if (t[i][i] == 0)
		{
			printf("There is no inverse matrix!");
			system("pause");
			exit(0);
		}
		//消去A的第i列除去i行以外的各行元素
		temp = t[i][i];
		for (j = 0; j < n; j++)
		{
			t[i][j] = t[i][j] / temp;        //主对角线上的元素变为1
			B[i][j] = B[i][j] / temp;        //伴随计算
		}
		for (j = 0; j < n; j++)        //第0行->第n行
		{
			if (j != i)                //不是第i行
			{
				temp = t[j][i];
				for (k = 0; k < n; k++)        //第j行元素 - i行元素*j列i行元素
				{
					t[j][k] = t[j][k] - t[i][k] * temp;
					B[j][k] = B[j][k] - B[i][k] * temp;
				}
			}
		}
	}
}
//测试
int main()
{
 int Mat[3][3]={1,2,3,4,7,8,9,4,5};
 int newMat[3][3];
 Gauss(Mat,newMat,3);//3*3矩阵
 /***输出函数****/
 return 0;
}

3.矩阵乘法

void Multy(int A[3][4],int  B[4][3],int result[3][3] )//计算A*B
{//没有做AB行列不等情况的判断
	for (int i = 0; i <3; i++)
	{//取A的每一行,共3行,因此i<3
		for (int j = 0; j <  3; j++)
		{//取B的每一列,共3列,因此j<3
			int sum = 0;
			for (int k = 0; k < 4; k++)
			{//对A行的所有列,B列的所有行。因此K=4
				sum += A[i][k] * B[k][j];//计算行列乘积之和
			}
			result[i][j] = sum;//计算A的第i行与B的第j列乘积之和,作为result的ij元素
		}
	}
}
int main()
{
   int result[3][3] ;//结果矩阵
   int A[3][4]={.....};
   int B[4][3]={.....};
   Multy(A,B,result);
   /****输出result********/
   return 0;
}

  • 16
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值