代码优化分析
冗余变量问题
初始代码中提前定义了 m=2,n=3; f=3,p=2;,但后续通过 cin 重新输入覆盖了这些值,导致初始赋值完全无效。建议删除这些冗余的初始化语句。
内层循环改进
原代码使用双变量 j 和 b 进行内层循环:
cpp
for (int j = 0,b=0; j < n&&b<f; ++j,++b)
由于 n == f,只需使用单变量 j 进行遍历即可,双变量写法降低了代码可读性。
重复输出问题
原代码在计算过程中打印了一次结果,随后又完整遍历输出矩阵,属于多余操作。优化后仅在最后输出一次结果矩阵。
变量命名规范
f代表第二个矩阵的行数,建议改为n2以提高可读性。a和b等变量名不够直观,建议改为col或k以符合矩阵编程习惯。
输出格式美化
原代码输出矩阵时未进行分行对齐,影响观感。优化后使用制表符 \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*B和B*A结果通常不同。 - 二维
vector适用于动态矩阵,但在工程中大规模运算建议使用数组或专用矩阵库。 - 避免使用双变量循环写法,改用单变量
k进行遍历。