大家好,又见面了,我是你们的朋友全栈君。
首先要知道矩阵是怎么相乘的
首先,两个矩阵要是想相乘需要满足,第一个矩阵的列数等于第二个矩阵的行数 满足的话就可以相乘得到新的矩阵了
举个例子嗷:
矩阵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有Ra行、Ca 列,B有Rb 行、Cb 列,有Ca与Rb 相等时,两个矩阵才能相乘。
输入格式: 输入先后给出两个矩阵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://javaforall.cn/153989.html原文链接:https://javaforall.cn