我正在编写一个C ++程序,以2D向量的形式乘以矩阵。矩阵具有预设尺寸并包含随机生成的双精度值。由于某种原因,我无法弄清楚,当我运行该程序时,抛出了out_of_range异常:
MatMulSeq.exe中0x7620dae8处抛出异常:Microsoft C ++异常:内存位置0x00b3eb20处的std :: out_of_range。
抛出异常:' System.Runtime.InteropServices.SEHException'在MatMulSeq.exe中
未处理的类型' System.Runtime.InteropServices.SEHException'发生在MatMulSeq.exe
其他信息:外部组件引发了异常。
我试图使用断点来确定抛出异常的位置,似乎是vec_b
填充的时候,但这可能是错误的。
我基本上从我在互联网上找到的其他程序中复制了这个程序的方法,这些程序已被确认有效,所以我不确定为什么我的失败。
这是我的代码:
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
double randNum()
{
double min = 1.0;
double max = 1000000.0;
return ((1000000.0 - 1.0) * ((double)rand() / (double)RAND_MAX) + min);
}
int main()
{
// Seed srand
unsigned seed = time(0);
srand(seed);
// Matrix setup
// # columns of 1st matrix must = # rows of 2nd matrix
// Result will have same # rows as 1st and same # columns as 2nd
int RowA = 50,
ColA = 20,
RowB = 20,
ColB = 25,
RowC = RowA,
ColC = ColB;
cout.precision(2);
vector<vector<double>> vec_a;
vec_a.resize(RowA);
for (int i = 0; i < RowA; ++i)
vec_a[i].resize(ColA);
vector<vector<double>> vec_b;
vec_b.resize(RowB);
for (int i = 0; i < RowB; ++i)
vec_a[i].resize(ColB);
vector<vector<double>> vec_c;
vec_c.resize(RowC);
for (int i = 0; i < RowC; ++i)
vec_c[i].resize(ColC);
// Fill matrices a and b
for (int i = 0; i < RowA; i++)
{
for (int j = 0; j < ColA; j++)
{
vec_a.at(i).at(j) = randNum();
}
}
for (int i = 0; i < RowB; i++)
{
for (int j = 0; j < ColB; j++)
{
vec_b.at(i).at(j) = randNum();
}
}
// Fill matrix c by multiplying matrices a and b
for (int i = 0; i < RowA; i++)
{
for (int j = 0; j < ColB; j++)
{
vec_c.at(i).at(j) = 0;
for (int k = 0; k < RowB; k++)
{
vec_c.at(i).at(j) = vec_c.at(i).at(j) + (vec_a.at(i).at(k) * vec_b.at(k).at(j));
}
}
}
// Display
for (int i = 0; i < RowA; i++)
{
for (int j = 0; j < ColA; j++)
{
cout << fixed << vec_a.at(i).at(j) << endl;
}
}
cout << endl << endl << endl;
for (int i = 0; i < RowB; i++)
{
for (int j = 0; j < ColB; j++)
{
cout << fixed << vec_b.at(i).at(j) << endl;
}
}
cout << endl << endl << endl;
for (int i = 0; i < RowC; i++)
{
for (int j = 0; j < ColC; j++)
{
cout << fixed << vec_c.at(i).at(j) << endl;
}
}
system("pause");
return 0;
}
对不起,如果我在这里问得太多,但我已经坚持了好几个小时,我真的可以使用一些指导。感谢
答案 0 :(得分:-1)
在
vector<vector<double>> vec_b;
vec_b.resize(RowB);
for (int i = 0; i < RowB; ++i)
vec_a[i].resize(ColB);
你正在调整vec_a的行,而不是vec_b的行,所以vec_b中的行都是空的。