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

C++ Matrix Multiplication Vector out_of_range Exception

本文关键字:of range 异常 out 向量 c++      更新时间:2023-10-16

我正在写一个c++程序,以二维向量的形式乘矩阵。矩阵具有预设的维度,并包含随机生成的双值。由于某些我无法弄清楚的原因,当我运行程序时抛出了一个out_of_range异常:

在MatMulSeq.exe中0x7620dae8抛出异常:Microsoft c++ Exception: std::out_of_range at memory location 0x00b3eb20.

抛出异常:'System.Runtime.InteropServices. 'MatMulSeq.exe中的SEHException

类型为"System.Runtime.InteropServices"的未处理异常。MatMulSeq.exe中出现SEHException

附加信息:外部组件抛出异常。

我尝试使用断点来确定异常被抛出的位置,似乎是当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;
}
我很抱歉,如果我在这里问得太多,但我已经被困在这个几个小时,我真的可以使用一些指导。由于

In

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