2016-09-04 169 views
0

我正在写一个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; 
} 

我很抱歉,如果我要求的太多了这里,但我一直停留在这几个小时,我真的可以使用一些指导。由于

+1

这不是你问的问题,但你应该学习如何使用外部库进行这种操作(矩阵乘法)。重新发明轮子没有意义。学习如何在lapack库中使用'dgemm'函数,这将为您有效地进行乘法运算。 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

不知道为什么你被低估,如果我是一个足够高的代表,我会赞成它。再次感谢。 –