线性代数矩阵相乘

代码优化分析

冗余变量问题

初始代码中提前定义了 m=2,n=3; f=3,p=2;,但后续通过 cin 重新输入覆盖了这些值,导致初始赋值完全无效。建议删除这些冗余的初始化语句。

内层循环改进

原代码使用双变量 jb 进行内层循环:

cpp 复制代码
for (int j = 0,b=0; j < n&&b<f; ++j,++b)

由于 n == f,只需使用单变量 j 进行遍历即可,双变量写法降低了代码可读性。

重复输出问题

原代码在计算过程中打印了一次结果,随后又完整遍历输出矩阵,属于多余操作。优化后仅在最后输出一次结果矩阵。

变量命名规范
  • f 代表第二个矩阵的行数,建议改为 n2 以提高可读性。
  • ab 等变量名不够直观,建议改为 colk 以符合矩阵编程习惯。
输出格式美化

原代码输出矩阵时未进行分行对齐,影响观感。优化后使用制表符 \t 对齐输出。

优化后代码

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    int m, n, p;
    std::cout << "请输入矩阵A的行数 列数:";
    std::cin >> m >> n;

    int n2, p2;
    std::cout << "请输入矩阵B的行数 列数:";
    std::cin >> n2 >> p2;

    if (n != n2) {
        std::cout << "矩阵行列不匹配,无法相乘!" << std::endl;
        return 1;
    }

    std::vector<std::vector<int>> A(m, std::vector<int>(n, 0));
    std::vector<std::vector<int>> B(n2, std::vector<int>(p2, 0));
    std::vector<std::vector<int>> C(m, std::vector<int>(p2, 0));

    std::cout << "\n请输入矩阵A(" << m << "行" << n << "列)元素:" << std::endl;
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            std::cin >> A[i][j];
        }
    }

    std::cout << "\n请输入矩阵B(" << n2 << "行" << p2 << "列)元素:" << std::endl;
    for (int i = 0; i < n2; ++i) {
        for (int j = 0; j < p2; ++j) {
            std::cin >> B[i][j];
        }
    }

    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < p2; ++j) {
            int sum = 0;
            for (int k = 0; k < n; ++k) {
                sum += A[i][k] * B[k][j];
            }
            C[i][j] = sum;
        }
    }

    std::cout << "\n矩阵 A * B 的结果:" << std::endl;
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < p2; ++j) {
            std::cout << C[i][j] << "\t";
        }
        std::cout << std::endl;
    }

    return 0;
}

核心逻辑对应数学规则

矩阵乘法的三层循环对应以下数学公式: C_{i,j} = \\sum_{k=0}\^{n-1} A_{i,k} \\times B_{k,j}

  • 外层循环 i:结果矩阵的行,对应左矩阵 A 的行。
  • 中层循环 j:结果矩阵的列,对应右矩阵 B 的列。
  • 内层循环 k:遍历 A 的行和 B 的列,进行对位相乘并累加。

测试示例

输入矩阵 A(2行3列):

复制代码
1 0 2
-1 3 1

输入矩阵 B(3行2列):

复制代码
4 1
2 0
-3 5

输出结果:

复制代码
-2      11
-1      4

与手工计算结果一致。

补充知识点

  • 矩阵乘法不满足交换律,A*BB*A 结果通常不同。
  • 二维 vector 适用于动态矩阵,但在工程中大规模运算建议使用数组或专用矩阵库。
  • 避免使用双变量循环写法,改用单变量 k 进行遍历。
相关推荐
张欣-男7 分钟前
3分钟理解线性代数
线性代数·算法
白狐_79811 分钟前
408 数据结构|外部排序优化:怎么减少时间开销
数据结构·算法
小白说大模型11 分钟前
Hermes 全配置指南:从裸版到 AI Agent 天花板
大数据·人工智能·学习·算法·机器学习·数据挖掘
a1879272183122 分钟前
【算法】动态规划入门:从打家劫舍到状态设计的三堂课
算法·leetcode·动态规划·dp·回溯·暴力
段一凡-华北理工大学31 分钟前
高炉智能布料技术与炉料分布优化~系列文章03:布料矩阵解码:环位、角度、圈数与料流的量化控制
java·网络·人工智能·矩阵·高炉智能化·高炉布料矩阵优化·高炉智能布料技术
淡海水10 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan10 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy11 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息12 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
木井巳13 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法