2D矢量乘法

时间:2016-04-29 12:50:34

标签: c++ vector multiplication

我的问题是,当我尝试将2D矢量乘以另一个2D矢量并将该过程的结果存储在另一个2D矢量中时,我的程序崩溃

    int main()
{

    vector< vector<double> > Mat_1;
    vector< vector<double> > Mat_2;
    vector< vector<double> > Mat_3;
// Generate 2D vector 5 by 5 
    setVector(Mat_1,5,5);
    setVector(Mat_2,5,5);

    for(int i=0; i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            Mat_3[i][j] = 0;

            for(int k=0;k<5;k++)
            {
                Mat_3[i][j] += Mat_1[i][k] * Mat_2[k][j];
            }
        }
    }


    return 0;
}

3 个答案:

答案 0 :(得分:1)

此行会导致问题:

    Mat_3[i][j] = 0;

由于您(至少从您显示的代码中)从未初始化Mat_3,请尝试添加:

setVector(Mat_3,5,5);

答案 1 :(得分:1)

您没有初始化第3个矩阵,而您正在对其进行索引操作,即未定义的行为。你可以这样做....

void init_2Dvector(vector<vector<double> >& vec, int x_dim, int y_dim){
    vec.resize(x_dim);
    for(int i=0; i < vec.size(); i++)
         vec[i].resize(y_dim);
}

int main()
{

    vector< vector<double> > Mat_1;
    vector< vector<double> > Mat_2;
    vector< vector<double> > Mat_3;
// Generate 2D vector 5 by 5 
    setVector(Mat_1,5,5);
    setVector(Mat_2,5,5);

// Set dimension for result
    init_2Dvector(Mat_3, 5, 5);

    for(int i=0; i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            Mat_3[i][j] = 0;

            for(int k=0;k<5;k++)
            {
                Mat_3[i][j] += Mat_1[i][k] * Mat_2[k][j];
            }
        }
    }


    return 0;
}

答案 2 :(得分:0)

您需要初始化Mat_3。因此,请确保将其尺寸设置为与其他矩阵相同。

一旦您包含适当的库并且使用using namespace std;

,这应该有效
int main()
{
    std::vector<std::vector<double>> Mat_1;
    std::vector<std::vector<double>> Mat_2;
    std::vector<std::vector<double>> Mat_3;
    setVector(Mat_1,5,5);
    setVector(Mat_2,5,5);
    setVector(Mat_3,5,5); // here initialize 

    for(int i=0; i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            Mat_3[i][j] = 0; // here assigning zeros

            for(int k=0;k<5;k++)
            {
                Mat_3[i][j] += Mat_1[i][k] * Mat_2[k][j]; // operation
            }
        }
    }
    return 0;
}