题目描述:
Alice在学线性代数。她觉得线代的计算特别麻烦,于是就来找你,希望你可以给她写一个程序计算两个矩阵的乘积。
矩阵乘法介绍: 矩阵A是一个N行P列的矩阵。 矩阵B是一个K行M列的矩阵。 当P=K时,A和B可以相乘(仅限于AB, BA不一定可行) 假设矩阵C=AB,那么C**i,j=∑t=1P(或K)A**i,t∗B**t,j
举个例子,假设A是一个2×3的矩阵,B是一个3×2的矩阵,最终结果C是一个2×2的矩阵,如下图所示
输入格式:
输入共一行,有三个整数N,P,M(N,P,M≤100)。表示矩阵A是一个N×P的矩阵,矩阵B是一个P×M的矩阵。
接下来N行,每行P个整数,读入矩阵A。
再接下来P行,每行M个整数,读入矩阵B。
数据保证在输入输出数据可以用int类型存储。
输出格式:
输出N行M列的矩阵C。每行最后一个数后面有一个空格。
输入样例:
在这里给出一组输入。例如:
3 3 3 1 3 2 1 0 0 1 2 2 0 0 2 7 5 0 2 1 1
输出样例:
在这里给出相应的输出。例如:
25 17 4 0 0 2 18 12 4
解题思路:
采用IPO思路实现功能:
题目大意:对于A矩阵的一行,去乘以B矩阵的每一列,分别做和,得到C矩阵的一行元素
结果是A矩阵与C矩阵行数相同,B矩阵与C矩阵列数相同
创建A、B、C三个二维数组,和一个num数组用来存储A、B的乘积
(1)I:
输入N,P,M三个整数
(2)P:
解题的关键在于理解行标和列标的循环关系,所以在这里先说明几个关系:
A矩阵每变化一行,B矩阵变化一周;
即A矩阵的行标变化一次,B矩阵的列标变化一周;
而B矩阵的列标每变化一次,行标需要变化一周;
又因为B矩阵的行标即为A矩阵的列标,故A矩阵的列标也需要变化一周;
至此,循环关系明确:
第一层:A矩阵行标
第二层:B矩阵列标
第三层:B矩阵行标和A矩阵列标,二者其实是一个标记物
第三层每轮循环结束,将结果存入num数组
(3)O:
逻辑上输出C矩阵即可;文章来源:https://www.toymoban.com/news/detail-783482.html
代码实现如下文章来源地址https://www.toymoban.com/news/detail-783482.html
#include <iostream> using namespace std; int A_matrix[100][100] = { 0 };//A矩阵 int B_matrix[100][100] = { 0 };//B矩阵 int num_array[100 * 100] = { 0 };//存储第三层每一轮运算结果 int main() { int N, P, M; cin >> N >> P >> M;//表示矩阵A是一个N×P的矩阵,矩阵B是一个P×M的矩阵,矩阵C是一个N×M的矩阵 for (int i = 0; i < N; i++)//读入A矩阵 { for (int j = 0; j < P; j++) { cin >> A_matrix[i][j]; } } for (int i = 0; i < P; i++)//读入B矩阵 { for (int j = 0; j < M; j++) { cin >> B_matrix[i][j]; } } int index = 0;//num数组下标 for (int a = 0; a < N; a++)//a为A矩阵的行标 { for (int b = 0; b < M; b++)//b为B矩阵的列标 { for (int c = 0; c < P; c++)//c为B矩阵的行标、A矩阵的列标 { num_array[index] += A_matrix[a][c] * B_matrix[c][b]; } index++; } } for (int i = 1; i <= N * M; i++)//输出C矩阵 { cout << num_array[i - 1] << ' '; if (i % M == 0)//每输出一行,换行 { cout << endl; } } return 0; }
到了这里,关于矩阵乘法(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!