矩阵乘法(C++)

题目描述:

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矩阵即可;

代码实现如下

#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;
​
}
  • 10
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WitheredSakura_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值