前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >矩阵相乘详解

矩阵相乘详解

作者头像
全栈程序员站长
发布2022-09-13 11:52:47
9700
发布2022-09-13 11:52:47
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

首先要知道矩阵是怎么相乘的

首先,两个矩阵要是想相乘需要满足,第一个矩阵的列数等于第二个矩阵的行数 满足的话就可以相乘得到新的矩阵了

举个例子嗷:

矩阵a:

1 2 3 3 2 2 2 1 2

矩阵b:

2 2 3 1 2 1

a矩阵是3 * 3(3行3列)的矩阵,b矩阵是3 * 2(3行2列)的矩阵,满足第一个矩阵的列数等于第二个矩阵的行数。那我们就可以相乘了

一个m*n的矩阵和一个n*p的矩阵相乘,将会得到一个m*p的矩阵

相乘得到的矩阵c是3*2的:

14 7 16 10 11 7

其实就是矩阵a的第一行每个元素分别与b的第一列相乘再求和,得到c矩阵的第一个数,然后a矩阵的第一行再与b矩阵的第二列相乘,得到第二个数,然后是a矩阵的第二行与b矩阵的第一列…

不明白的看下边吧:

1 * 2 + 2 * 3 + 3 * 2 = 14 1 * 2 + 2 * 1 + 3 * 1 = 7 3 * 2 + 2 * 3 + 2 * 2 = 16 3 * 2 + 2 * 1 + 2 * 1 = 10 2 * 2 + 1 * 3 + 2 * 2 = 11 2 * 2 + 1 * 1 + 2 * 1 = 7


好了,懂了怎么相乘就来看题吧…

先看这道题…

题目描述 矩阵A规模是n×m,矩阵B规模是m×p,现在需要你求A*B

输入 输入n,m。然后输入n×m的矩阵。

输入p,然后输入m×p的矩阵。

1<=n,m,p<=100

-10000<=矩阵元素<=10000

输出 输出相乘后的n×p的矩阵

样例输入 2 3 1 2 3 3 2 1 2 1 1 2 2 3 3 样例输出 14 14 10 10

代码语言:javascript
复制
#include<iostream>
#include<cstring>
using namespace std;
int main()
{ 
   
    int a[110][110]={ 
   };
    int b[110][110]={ 
   };
    int c[110][110]={ 
   };
    
    int n=0,m=0,p=0;
    cin>>n>>m;//矩阵a为n*m(n行m列) 
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	    scanf("%d",&a[i][j]);
		
    cin>>p;  //矩阵b为m*p(m行p列)
    for(int i=0;i<m;i++)
	  for(int j=0;j<p;j++)
	    scanf("%d",&b[i][j]);	
		
    for(int i=0;i<n;i++)   //矩阵c是a与b相乘得到的 
	  for(int j=0;j<p;j++) //n*p(n行p列) 
	    for(int k=0;k<m;k++)
		  c[i][j]+=a[i][k]*b[k][j];
		  
	for(int i=0;i<n;i++)
	{ 
   
		for(int j=0;j<p;j++)
	     cout<<c[i][j]<<" ";
		cout<<endl; 
	}
	return 0;   	  		   		 
}

这一题根上面那一道没什么区别…

L1-048 矩阵A乘以B (15分) 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有R​a行、C​a​​ 列,B有R​b 行、C​b​​ 列,有C​a​与R​b 相等时,两个矩阵才能相乘。

输入格式: 输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式: 若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1: 2 3 1 2 3 4 5 6 3 4 7 8 9 0 -1 -2 -3 -4 5 6 7 8

输出样例1: 2 4 20 22 24 16 53 58 63 28

输入样例2: 3 2 38 26 43 -5 0 17 3 2 -11 57 99 68 81 72

输出样例2: Error: 2 != 3

代码语言:javascript
复制
#include<iostream>
using namespace std;
int main()
{ 
   
	int a[105][105]={ 
   };
	int b[105][105]={ 
   };
	int c[105][105]={ 
   };
	
	int n=0,m=0,p=0,q=0;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	     scanf("%d",&a[i][j]);
	     
	cin>>p>>q;
	for(int i=0;i<p;i++)
	  for(int j=0;j<q;j++)
	     scanf("%d",&b[i][j]);     
	     
	if(m!=p)
	cout<<"Error: "<<m<<" != "<<p;
	else
	{ 
   
		cout<<n<<" "<<q<<endl;
		for(int i=0;i<n;i++)
		  for(int j=0;j<q;j++)
		    for(int k=0;k<m;k++)
		      c[i][j]+=a[i][k]*b[k][j];
	    
		for(int i=0;i<n;i++)
		{ 
   
			for(int j=0;j<q;j++)
			{ 
   
				if(j==q-1)
				cout<<c[i][j];   //注意每行最后一个数字后没有空格 
				else
				cout<<c[i][j]<<" ";
			}
			if(i!=n-1)
			cout<<endl;
		}	  		  	
	}
	return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153989.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档