矩阵相乘详解

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

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

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

举个例子嗷:

矩阵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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号