【C语言】设计实现M*N矩阵和N*M矩阵相乘

#include<stdio.h>
int main()
{
	int i,j,k,M,N,a[10][10],b[10][10],c[10][10];  //定义两个输入矩阵,一个输出矩阵 
	printf("请输入第一个矩阵的行数M="); 
	scanf("%d",&M);
	printf("请输入第一个矩阵的列数N=");
	scanf("%d",&N); 
	printf("请输入一个%d*%d矩阵a=\n",M,N);     //输入a矩阵 
	for (i=0;i<M;i++)               
	{
		for (j=0;j<N;j++)
		scanf("%d",&a[i][j]);
	}

	printf("请输入一个%d*%d矩阵b=\n",N,M);      //输入b矩阵   
	for (i=0;i<N;i++) 
	{
		for (j=0;j<M;j++)
		scanf("%d",&b[i][j]);
	}
	printf("a矩阵\n");             //输出a矩阵 
	for (i=0;i<M;i++)
	{
		for (j=0;j<N;j++)
		printf("%d ",a[i][j]);
		printf("\n");	
	}       
	printf("b矩阵\n");             //输出b矩阵 
	for (i=0;i<N;i++)
	{
		for (j=0;j<M;j++)
		printf("%d ",b[i][j]);
		printf("\n");	
	}     

	for (i=0;i<M;i++)                   //矩阵c=a*b 
	{                                   //c矩阵中储存数据时用a矩阵的行*b矩阵的列 
		for(j=0;j<M;j++)
		{	c[i][j]={0};                  //每一次计算c前都要置零 
			for(k=0;k<N;k++)
			{
			c[i][j]+=a[i][k]*b[k][j];
			}
		}
	}
	printf("*****************************************\n") ;
	for (i=0;i<M;i++)                   //c矩阵中 行等于a的行 列等于b的列 
	{
		for(j=0;j<M;j++)
		printf("%d  ",c[i][j]);
		printf("\n");
	}  
	return 0;
}

输入输出矩阵都需要用到两次循环,因为矩阵与行和列有关,运用到二维数组。

本题重点在于设计两矩阵相乘后数据的储存。

首先,了解c矩阵(线代相关知识)

由于a的行数是b的列数,a的列数是b的行数,则两个矩阵相乘得到的矩阵c一定是一个方阵(行数与列数相等)。在a、b矩阵相乘时,a的第1行中每一个数与b的第1列中每一个数相乘相加,得到c中第1个数c[0][0];a的第1行中每一个数与b的第2列中每一个数相乘相加,得到c中第2个数c[0][1]......因此:c的列数是b的列数(M)即a的行数(M)

其次,设计c矩阵

观察c其中一个例子c[0][1]发现,a、b相乘得c[0][1]时,a的行不变,列递增;b的列不变,行递增。则可以在行、列循环里再加入递增的循环,递增次数取决于a的列数(或b的行数)。

 由上述分析得到c的代码段

	for (i=0;i<M;i++)                   
	{                                  
		for(j=0;j<M;j++)
		{	c[i][j]={0};                  
			for(k=0;k<N;k++)
			{
			c[i][j]+=a[i][k]*b[k][j];
			}
		}
	}

最后,还要注意

①C语言中“数组长度”,即[  ]下标运算符中必须是整型常量,不可以将M、N直接写入,所以在一开始定义了a、b、c三个二维数组的一、 二维数组长度均为10(也可以是其他整型常量,只要保证scanf在你设定的范围内),M与N的值也需要用户先输入。

②c[i][j]在每一使用时都要置零,用0初始化,否则会得到错误结果。

测试结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值