用std::vector实现矩阵乘法最稳妥,因其灵活安全、支持变尺寸;而原生c风格二维数组因列数需编译期常量,无法通用传参。

二维数组用 std::vector<:vector>></:vector> 实现矩阵乘法最稳妥
原生 C 风格二维数组(如 int a[3][4])在 C++ 里无法直接传参做通用矩阵乘,因为列数必须是编译期常量。用 std::vector<:vector>></:vector> 虽稍慢但灵活、安全、可变尺寸,适合绝大多数实际场景。
常见错误:试图写 void mul(int a[][n], int b[][n], int c[][n]) ——n 不是模板参数时,编译直接报错:error: array bound is not an integer constant。
实操建议:
- 用
std::vector<:vector>></:vector>存储,行优先,每行长度一致(即矩形) - 乘法前务必检查维度:若
A是m×k,B是k×n,则结果C应为m×n;否则抛异常或返回空 - 初始化结果矩阵时,用
std::vector<:vector>>(m, std::vector<int>(n, 0))</int></:vector>,避免未初始化值干扰
operator* 重载能让矩阵乘法像数学一样写
封装成类后,A * B 比 matmul(A, B) 更直观,也便于后续扩展(比如加 +=、==)。
关键点:
- 重载函数必须是
const成员函数,且不修改当前对象 - 返回新对象(不是引用),避免悬垂引用
- 内部仍用三重循环:外两层遍历
i(行)、j(列),内层累加k(求和索引)
示例核心片段:
Matrix operator*(const Matrix& other) const {
if (cols != other.rows) throw std::invalid_argument("dim mismatch");
Matrix res(rows, other.cols);
for (int i = 0; i <h3>用裸指针 + <code>new int[m*n]</code> 可提升性能但风险高</h3><p>当矩阵极大(如 >1000×1000)且频繁计算时,连续内存布局比 <code>vector<vector></vector></code> 的指针跳转快 10%–30%,但代价是手动管理内存和易出错。</p><p>容易踩的坑:</p>
- 行列下标混淆:
data[i * n + j]是第i行第j列;写成i + j * m就全乱了 - 忘记
delete[]或重复释放,导致崩溃或内存泄漏 - 拷贝构造/赋值未深拷贝,两个对象指向同一块内存,一改全改
若坚持用裸指针,至少封装进 RAII 类,析构里 delete[] data,并禁用默认拷贝(或实现深拷贝)。
别忽略稀疏矩阵场景:用 std::map<:pair>, int></:pair> 或专用库
如果矩阵里 95% 以上是 0(比如图的邻接矩阵、推荐系统特征矩阵),硬乘密集版会浪费大量时间在乘 0 上。
简单替代方案:
- 用
std::map<:pair int>, int></:pair>存非零元,乘法只遍历 A 的非零行 × B 的非零列交集 - 更稳的做法是引入
Eigen(头文件库)或Armadillo,它们自动检测稀疏性并选算法 - 手写稀疏乘法时,B 最好按列存储(或转置后按行),否则缓存命中率极低
一个被反复忽略的细节:即使你写的是一般矩阵乘法,输入数据本身是否稀疏,往往比算法选择更能决定实际耗时。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











