三重循环实现O(n³)矩阵乘法算法崩溃问题求助
问题分析与修复方案
你的程序在第二层循环第一次迭代后崩溃,核心原因是结果矩阵ans没有提前分配内存空间,直接访问ans[i][j]触发了内存越界的未定义行为。
具体问题点
你初始化ans的方式是:
vector<vector<int>> ans;
这只是创建了一个空的二维向量,既没有行数也没有列数。当第一次执行到ans[i][j] = 0;时,ans中根本不存在第i行,更不存在该行的第j列元素,直接访问会导致程序崩溃,所以只会打印一次"second loop"就终止了。
修复后的代码
我们需要提前为ans分配好正确的尺寸:结果矩阵的行数等于第一个矩阵的行数r1,列数等于第二个矩阵的列数c2,并且初始化为0(这样可以省去手动赋值ans[i][j] = 0的步骤)。
#include <vector> #include <iostream> using namespace std; vector<vector<int>> getMultiplication(vector<vector<int>> a , vector<vector<int>> b , int r1 , int c1 , int r2 , int c2){ // 先判断矩阵乘法的合法性:第一个矩阵的列数必须等于第二个矩阵的行数 if (c1 != r2) { cerr << "矩阵无法相乘:第一个矩阵的列数不等于第二个矩阵的行数!" << endl; return {}; } // 初始化结果矩阵:r1行,每行c2个0元素 vector<vector<int>> ans(r1, vector<int>(c2, 0)); cout << r1 << "\n" << c1 << "\n" << r2 << "\n" << c2 << "\n"; for(int i = 0; i < r1; i++) { cout << "first loop" << "\n"; for (int j = 0; j < c2; j++){ cout << "second loop" << "\n"; // 这里不需要再赋值0了,初始化已经完成 for (int k = 0; k < r2; k++) { cout << "third loop" << "\n"; ans[i][j] += a[i][k] * b[k][j]; } } } return ans; }
额外优化建议
- 参数传递优化:把
vector<vector<int>> a和vector<vector<int>> b改成const vector<vector<int>>& a和const vector<vector<int>>& b,避免不必要的拷贝,提升性能。 - 合法性检查:如代码中添加的判断,确保输入的矩阵满足乘法条件,避免无意义的计算。
内容的提问来源于stack exchange,提问作者h0sny
相关产品推荐
相关产品推荐

