我正在写一个C++程序以2D向量的形式乘以矩阵。矩阵具有预设尺寸并包含随机生成的双值。出于某种原因,我想不通,当我运行程序的out_of_range抛出异常:内存位置0x00b3eb20的std :: out_of_range:C++矩阵乘法向量out_of_range异常
异常在MatMulSeq.exe在0x7620dae8抛出:微软C++异常。
抛出异常: '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;
}
我很抱歉,如果我要求的太多了这里,但我一直停留在这几个小时,我真的可以使用一些指导。由于
这不是你问的问题,但你应该学习如何使用外部库进行这种操作(矩阵乘法)。重新发明轮子没有意义。学习如何在lapack库中使用'dgemm'函数,这将为您有效地进行乘法运算。 http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html –
你使用调试器吗?它不应花费数小时来查明那些at()调用中的哪一个抛出异常。 – PaulMcKenzie
@PaulMcKenzie真的不知道如何,我通常不使用C++和Visual Studio。我只需要编写一个关于并行编程的课程。 –