C ++矩阵乘法向量out_of_range异常

时间:2016-09-04 20:39:32

标签: c++ exception matrix vector

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

对不起,如果我在这里问得太多,但我已经坚持了好几个小时,我真的可以使用一些指导。感谢

1 个答案:

答案 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中的行都是空的。