创建两个向量,并将值分配给两个向量,然后将两个向量彼此相乘。 (矩阵乘法)。在乘法函数中给出分段错误。尝试访问范围之外的位置是否有帮助?
#include<iostream>
#include <vector>
using namespace std;
int n;
vector <int> mat1Rows;
vector <int> mat2Rows;
vector <int> multRows;
vector <vector<int> > mat1;
vector <vector<int> > mat2;
vector <vector<int> > multMat;
void assignValues(int num){
for(int i = 0; i < num; i++){
for(int j = 0; j < num; j++){
mat1Rows.push_back(j);
mat2Rows.push_back(j);
}
mat1.push_back(mat1Rows);
mat2.push_back(mat2Rows);
mat1Rows.clear();
mat2Rows.clear();
}
}
void multiply(int n){
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
for(int k = 0; k < n; ++k){
multMat[i][j] += mat1[i][k] * mat2[k][j];
}
}
}
}
void displayMult(int n){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cout << multMat[i][j] << " " ;
}
cout << endl;
}
}
int main(){
cout << "Enter the size of the matrix: ";
cin >> n;
assignValues(n);
multiply(n);
displayMult(n);
return 0;
}
答案 0 :(得分:1)
multMat[i][j] += mat1[i][k] * mat2[k][j];
multMat
内没有内存,因为您没有为元素保留任何内存。您需要告诉向量分配内存。您可以使用resize完成操作,为元素分配内存并更改向量的大小。
void multiply(int n) {
multMat.resize(n);
for (auto&& i : multMat) {
i.resize(n);
}
... rest of the code ...
}
std::vector::operator[]
不执行边界检查。因此,如果您在允许范围之外指定索引并尝试为返回的引用分配某些内容,则会发生未定义的行为。使用std::vector::at()
来确保您的索引始终有效。