矩阵相乘详解

矩阵相乘详解首先要知道矩阵是怎么相乘的首先,两个矩阵要是想相乘需要满足,第一个矩阵的列数等于第二个矩阵的行数满足的话就可以相乘得到新的矩阵了举个例子嗷:矩阵a:123322212矩阵b:223121a矩阵是3*3(3行3列)的矩阵,b矩阵是3*2(3行2列)的矩阵,满足第一个矩阵的列数等于第二个矩阵的行数。那我们就可以相乘了一个m*n的矩阵和一个…

大家好,欢迎来到IT知识分享网。

首先要知道矩阵是怎么相乘的
在这里插入图片描述
在这里插入图片描述
首先,两个矩阵要是想相乘需要满足,第一个矩阵的列数等于第二个矩阵的行数
满足的话就可以相乘得到新的矩阵了

举个例子嗷:

矩阵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

#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

#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://yundeesoft.com/10224.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信