[C.C++] 矩阵乘法(C++)

38 0
Honkers 昨天 13:57 | 显示全部楼层 |阅读模式

题目描述:

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。每行最后一个数后面有一个空格。

输入样例:

在这里给出一组输入。例如:

  1. 3 3 3
  2. 1 3 2
  3. 1 0 0
  4. 1 2 2
  5. 0 0 2
  6. 7 5 0
  7. 2 1 1
复制代码

输出样例:

在这里给出相应的输出。例如:

  1. 25 17 4
  2. 0 0 2
  3. 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矩阵即可;

代码实现如下

  1. #include <iostream>
  2. using namespace std;
  3. int A_matrix[100][100] = { 0 };//A矩阵
  4. int B_matrix[100][100] = { 0 };//B矩阵
  5. int num_array[100 * 100] = { 0 };//存储第三层每一轮运算结果
  6. int main()
  7. {
  8. int N, P, M;
  9. cin >> N >> P >> M;//表示矩阵A是一个N×P的矩阵,矩阵B是一个P×M的矩阵,矩阵C是一个N×M的矩阵
  10. for (int i = 0; i < N; i++)//读入A矩阵
  11. {
  12. for (int j = 0; j < P; j++)
  13. {
  14. cin >> A_matrix[i][j];
  15. }
  16. }
  17. for (int i = 0; i < P; i++)//读入B矩阵
  18. {
  19. for (int j = 0; j < M; j++)
  20. {
  21. cin >> B_matrix[i][j];
  22. }
  23. }
  24. int index = 0;//num数组下标
  25. for (int a = 0; a < N; a++)//a为A矩阵的行标
  26. {
  27. for (int b = 0; b < M; b++)//b为B矩阵的列标
  28. {
  29. for (int c = 0; c < P; c++)//c为B矩阵的行标、A矩阵的列标
  30. {
  31. num_array[index] += A_matrix[a][c] * B_matrix[c][b];
  32. }
  33. index++;
  34. }
  35. }
  36. for (int i = 1; i <= N * M; i++)//输出C矩阵
  37. {
  38. cout << num_array[i - 1] << ' ';
  39. if (i % M == 0)//每输出一行,换行
  40. {
  41. cout << endl;
  42. }
  43. }
  44. return 0;
  45. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

特级红客

关注
  • 3259
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行