Я пишу программу на C++ для умножения матриц в виде 2D-векторов. Матрицы имеют предустановленные размеры и содержат случайно сгенерированные двойные значения. По какой-то причине, что я не могу понять, когда я запускаю программу исключение out_of_range брошено:C++ Matrix Multiplication Vector out_of_range Exception
Exception брошенную в 0x7620dae8 в MatMulSeq.exe: Microsoft C++ исключение: зЬй :: out_of_range в ячейке памяти 0x00b3eb20.
Исключение брошено: '' 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;
}
Я извиняюсь, если я прошу слишком много здесь, но я застрял на этом в течение нескольких часов, и я действительно мог бы использовать некоторые указания. Благодаря
Это не то, что вы просили, но вы должны научиться использовать внешние библиотеки для таких операций (умножение матриц). Не имеет смысла изобретать велосипед. Узнайте, как использовать функцию 'dgemm' в библиотеке lapack, которая будет делать умножение для вас эффективно. http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html –
Вы использовали отладчик? Не должно было уходить несколько часов, чтобы определить, какой из этих вызовов 'at()' вызывает исключение. – PaulMcKenzie
@PaulMcKenzie действительно не знал, как, я обычно не использую C++ и Visual Studio. Мне просто пришлось написать эту программу для класса по параллельному программированию. –