一、项目背景详细介绍

矩阵乘法是线性代数中的核心基础操作,也是几乎所有计算机科学、工程科学、物理数学领域中不可或缺的部分。它被广泛应用于:

  • 3D 图形变换(旋转、缩放、平移)

  • 机器学习与神经网络(权重矩阵运算)

  • 求解线性方程组

  • 信号处理

  • 数据压缩与降维

  • 微分方程数值求解

  • 各类算法课程中的示例数据结构

矩阵运算在 C++ 中不仅是基础教学内容,也是数值计算库、机器学习系统中的底层重要组成部分。例如:

  • TensorFlow、PyTorch 的张量运算

  • OpenCV 图像处理中的几何变换矩阵

  • 机器人学中的齐次坐标矩阵

  • 科研计算中的稠密矩阵与稀疏矩阵运算

因此,实现 普通矩阵乘法(数值乘法 + 求和) 是 C++ 学习者必须掌握的内容。

普通矩阵乘法定义如下:

若 A 是 m×n 矩阵,B 是 n×p 矩阵,则 C = A × B 是一个 m×p 矩阵,其元素计算方式为:

C[i][j] = Σ_k (A[i][k] × B[k][j])

该运算不同于布尔关系矩阵乘积,它是纯数值运算,是线性代数中最核心的运算之一。

本项目目标是使用 C++ 实现一个通用、清晰、教学友好、可扩展、可复用的矩阵乘法程序。


二、项目需求详细介绍

1. 基本功能需求

  • 输入矩阵 A 与矩阵 B

  • 检查矩阵是否满足可乘条件

  • 执行普通矩阵乘法

  • 输出结果矩阵 C

2. 扩展功能(可选)

  • 支持自动检测维度合法性

  • 支持矩阵文件输入输出

  • 支持 double 类型或 float 类型

  • 支持计算负数矩阵及非整数矩阵

  • 支持矩阵大小较大时的性能优化接口

3. 程序设计要求

  • 使用 vector<vector<double>> 实现通用矩阵

  • 提供良好注释

  • 结构清晰、逻辑分明

  • 模块化设计(打印函数、乘法函数等)

4. 输出要求

  • 格式化输出结果矩阵

  • 计算结果精确表示


三、相关技术详细介绍

1. C++ 基础知识

  • 输入输出:cin、cout

  • vector 容器:动态数组

  • for 循环

  • 函数封装

  • 引用传递减少数据拷贝

2. C++ STL 技术

  • 多维 vector 表示矩阵:
    vector<vector<double>> matrix;

  • 使用 push_back 自动增长

  • 使用 size() 获取维度

3. 矩阵数学知识

普通矩阵乘法 C = A × B:

  • A 为 m×n

  • B 为 n×p

  • C 为 m×p

计算公式:


C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + A[i][2]*B[2][j] + ... A[i][n−1]*B[n−1][j]

矩阵乘法具有以下性质:

  • 结合律: (A×B)×C = A×(B×C)

  • 分配律: A×(B+C) = A×B + A×C

  • 不满足交换律: A×B ≠ B×A

4. C++ 结构化程序设计

  • 函数职责单一:乘法函数只负责计算

  • 输出函数负责格式化显示

  • main 函数控制程序流程


四、实现思路详细介绍

1. 输入矩阵维度

矩阵 A:


m 行 n 列

矩阵 B:


n 行 p 列

若矩阵 A 的列数不等于矩阵 B 的行数,则无法进行乘法。

2. 输入矩阵内容

用户逐行、逐列输入矩阵数据
使用 vector 存储:


vector<vector<double>> A(m, vector<double>(n));

3. 实现矩阵乘法

通过三层循环计算:


for i from 0 to m-1: for j from 0 to p-1: C[i][j] = 0 for k from 0 to n-1: C[i][j] += A[i][k] * B[k][j]

4. 输出矩阵

格式化打印矩阵 C。


五、完整实现代码

/************************************************************
 * C++ 实现普通矩阵 A 和 B 的乘积
 * 使用标准矩阵乘法:
 *      C[i][j] = Σ_k (A[i][k] × B[k][j])
 *
 * 作者:曹磊
 * 教学用途:博客、课程实验、C++矩阵运算示例
 ************************************************************/

#include <iostream>
#include <vector>
using namespace std;

/*==============================================================
  工具函数:printMatrix
  作用:格式化输出任意二维矩阵(double 类型)
================================================================*/
void printMatrix(const vector<vector<double>>& M) {
    for (const auto& row : M) {
        for (double v : row) {
            cout << v << " ";
        }
        cout << endl;
    }
}

/*==============================================================
  函数:multiplyMatrix
  作用:执行普通矩阵乘法 C = A × B

  参数:
    - A:m×n 矩阵
    - B:n×p 矩阵
  返回:
    - C:m×p 矩阵
================================================================*/
vector<vector<double>> multiplyMatrix(
        const vector<vector<double>>& A,
        const vector<vector<double>>& B) {

    int m = A.size();         // A 行数
    int n = A[0].size();      // A 列数 = B 行数
    int p = B[0].size();      // B 列数

    vector<vector<double>> C(m, vector<double>(p, 0.0));

    // 三层循环:i-行  j-列  k-中间维度
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < p; j++) {
            double sum = 0.0;
            for (int k = 0; k < n; k++) {
                sum += A[i][k] * B[k][j];
            }
            C[i][j] = sum;
        }
    }

    return C;
}

/*==============================================================
  主程序入口 main()
  完整流程:
    1. 输入矩阵尺寸
    2. 输入矩阵内容
    3. 校验维度是否可乘
    4. 调用矩阵乘法函数
    5. 输出结果
================================================================*/
int main() {

    int m, n, n2, p;

    cout << "请输入矩阵 A 的行数、列数 m n: ";
    cin >> m >> n;

    cout << "请输入矩阵 B 的行数、列数 n p: ";
    cin >> n2 >> p;

    // 维度校验
    if (n != n2) {
        cout << "错误:矩阵 A 的列数必须等于矩阵 B 的行数!" << endl;
        return 0;
    }

    vector<vector<double>> A(m, vector<double>(n));
    vector<vector<double>> B(n, vector<double>(p));

    cout << "请输入矩阵 A:" << endl;
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            cin >> A[i][j];

    cout << "请输入矩阵 B:" << endl;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < p; j++)
            cin >> B[i][j];

    cout << "矩阵 A:" << endl;
    printMatrix(A);
    cout << "矩阵 B:" << endl;
    printMatrix(B);

    vector<vector<double>> C = multiplyMatrix(A, B);

    cout << "矩阵乘积 C = A × B:" << endl;
    printMatrix(C);

    return 0;
}

六、代码详细解读

1. printMatrix

负责打印矩阵,将 vector<vector<double>> 逐行输出,使矩阵显示美观。

2. multiplyMatrix

实现普通矩阵乘法 A×B,内部使用三层循环:

  • i:遍历 A 的行

  • j:遍历 B 的列

  • k:计算 dot product(点积)

返回结果矩阵 C。

3. main

负责整个操作流程:

  • 读取输入

  • 校验维度合法性

  • 输入矩阵 A/B

  • 打印

  • 调用矩阵乘法

  • 输出结果


七、项目详细总结

本项目完成了:

  • 普通矩阵乘法的数学推导

  • C++ 数据结构与程序设计

  • 完整的输入、运算、输出流程

  • 代码模块化与可维护性

  • 使用标准 C++ STL 实现,无需第三方库

本实现结构清晰、适合教学,同时具有可扩展性,可直接用于:

  • 课程实验

  • 博客示例

  • 线性代数程序作业

  • 更大型数值计算系统


八、项目常见问题及解答(FAQ)

1. 为什么不能让用户输入任意维度?

因为矩阵乘法要求 A 的列数必须等于 B 的行数,否则无法进行运算。

2. C++ 是否可以支持 double 精度?

可以,本代码已采用 double 类型,适用于浮点运算。

3. 时间复杂度是多少?

标准矩阵乘法复杂度为 O(mnp)。

4. 多维数组能否代替 vector?

可以,但 vector 更灵活且安全。

5. 是否可以使用动态分配 new?

可以,但 vector 更推荐,因为它能自动管理内存,避免泄漏。


九、扩展方向与性能优化

1. 使用 Strassen 算法提升性能

将复杂度从 O(n³) 降为 O(n^2.807),适合大型矩阵。

2. 使用 SIMD(如 AVX-512)加速

可显著提升乘法速度。

3. 使用 OpenMP 并行化

多线程计算矩阵乘法,加速 5~20 倍。

4. 使用 CUDA 在 GPU 上加速

速度可达到 CPU 的上百倍,用于科学计算与深度学习。

5. 封装成 Matrix 类

支持运算符重载:


Matrix C = A * B;

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐