C++使用vector实现矩阵乘转置程序运行中断问题排查求助
错误原因
- 向量初始化维度错误
你初始化的三个向量维度全部不符合要求:- 原矩阵
vec是row行col列,你错误将每行大小设为row,当col > row时,后续给vec[i][j]赋值就会出现越界 - 转置矩阵
tran应该是col行row列,你错误初始化为row行row列,后续访问tran[i][j]当i >= row时直接越界崩溃,这就是程序打印完原矩阵就终止的核心原因 - 原矩阵乘转置矩阵的结果
ans维度是row行row列,你初始化时每行大小设置错误,且默认填充值不需要设为col,应该初始化为0
- 原矩阵
- 转置赋值逻辑写反
转置的正确赋值逻辑是tran[j][i] = vec[i][j],你写反为tran[i][j] = vec[j][i],vec只有row行,当j >= row时访问vec[j][i]直接越界 - 矩阵乘法逻辑完全错误
矩阵乘法要求结果矩阵的ans[i][j]是原矩阵第i行和转置矩阵第j列的逐元素乘积求和,你写的赋值逻辑完全不符合矩阵乘法规则
修正后的完整代码
// Multiplication of Matrix by its Transpose #include <bits/stdc++.h> using namespace std; int main() { int row,col; cout<<"ENTER ROWS:"; cin>>row; cout<<"ENTER COLS:"; cin>>col; // 修正三个向量的初始化维度 vector<vector<int>> vec(row, vector<int> (col, 0)); vector<vector<int>> tran(col, vector<int> (row, 0)); vector<vector<int>> ans(row, vector<int> (row, 0)); for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { int t; cin>>t; vec[i][j]=t; } } cout<<"\n"<<"Orignal Matrix:"<<endl; for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { cout<<vec[i][j]<<" "; } cout<<"\n"; } // 修正转置赋值逻辑 for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { tran[j][i] = vec[i][j]; } } cout<<"\n\nTranspose Matrix: \n\n"; for(int i=0;i<col;i++) { for(int j=0;j<row;j++) { cout<<tran[i][j]<<" "; } cout<<endl; } // 修正矩阵乘法逻辑 for(int i=0;i<row;i++) { for(int j=0;j<row;j++) { for(int k=0;k<col;k++) { ans[i][j] += vec[i][k] * tran[k][j]; } } } cout<<"\n\nMultiplied Matrix: \n\n"; for(int i=0;i<row;i++) { for(int j=0;j<row;j++) { cout<<ans[i][j]<<" "; } cout<<endl; } return 0; }
内容的提问来源于stack exchange,提问作者user14674875
相关产品推荐
相关产品推荐

