2016-09-04 3 views
0

Я пишу программу на 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; 
} 

Я извиняюсь, если я прошу слишком много здесь, но я застрял на этом в течение нескольких часов, и я действительно мог бы использовать некоторые указания. Благодаря

+1

Это не то, что вы просили, но вы должны научиться использовать внешние библиотеки для таких операций (умножение матриц). Не имеет смысла изобретать велосипед. Узнайте, как использовать функцию 'dgemm' в библиотеке lapack, которая будет делать умножение для вас эффективно. http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html –

+0

Вы использовали отладчик? Не должно было уходить несколько часов, чтобы определить, какой из этих вызовов 'at()' вызывает исключение. – PaulMcKenzie

+0

@PaulMcKenzie действительно не знал, как, я обычно не использую C++ и Visual Studio. Мне просто пришлось написать эту программу для класса по параллельному программированию. –

ответ

-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 все пусто.

+0

Любые комментарии или пояснения для downvote? – js441

+0

Ницца! Большое спасибо. –

+0

не знаю, почему вы были занижены, если бы я был достаточно высоким представителем, я бы его повысил. Еще раз спасибо. –

Смежные вопросы