C++实现普通矩阵A和B的乘积(附带源码)
一、项目背景详细介绍
矩阵乘法是线性代数中的核心基础操作,也是几乎所有计算机科学、工程科学、物理数学领域中不可或缺的部分。它被广泛应用于:
-
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;
更多推荐
所有评论(0)