使用2d向量的矩阵乘法

时间:2016-02-22 10:41:45

标签: c++ matrix vector

以下是我的代码:

void matrix(int rowsInA, int columnsInA, int columnsInB){




    std::vector< vector<int> > a; 
    std::vector< vector<int> > b;


    for (int i = 0; i < rowsInA; i++) {
        vector<int> myRow(1);
        a.push_back(myRow);
        for (int j = 0; j < columnsInA-1; j++) {

            int x = rand() % 100;;
            myRow.push_back(x);

        }
    }

    for (int i = 0; i < rowsInA; i++) {
        vector<int> myRow(1);
        b.push_back(myRow);
        for (int j = 0; j < columnsInB-1; j++) {
            int x = rand() % 100;;
            myRow.push_back(x);

        }
    }
    std::vector< vector<int> > c = multiply(a, b);

    for (int i = 0; i < rowsInA; i++) {
        for (int j = 0; j < columnsInB; j++) {
            cout << c[i][j];
        }

    }
}

std::vector< vector<int> > multiply(std::vector< vector<int> > a , std::vector< vector<int> > b) {
    int rowsInA = 9;
    int columnsInA = 9; // same as rows in B
    int columnsInB = 9;
    std::vector< vector<int> > d;

    for (int i = 0; i < rowsInA; i++) {
        for (int j = 0; j < columnsInB; j++) {
            vector<int> myRow;
            myRow.push_back(a[i][0]);
            d.push_back(myRow);

            for (int k = 0; k < columnsInA; k++) {

                myRow.push_back(myRow[i]+ a[i][k] * b[k][j]);//error here
            }
        }
    }
    return d;
}

第一个函数矩阵()在向量中创建两个向量,并为其分配随机值,然后调用乘法中的向量乘法。 它给出了向量下标超出范围错误

1 个答案:

答案 0 :(得分:1)

您的代码:

    for (int i = 0; i < rowsInA; i++) {
        vector<int> myRow(1);
        a.push_back(myRow);
        for (int j = 0; j < columnsInA-1; j++) {
            int x = rand() % 100;;
            myRow.push_back(x);
        }
    }

构造单个元素向量,将其推送到a,附加一些 你临时的价值观,然后把它扔掉。 C ++不是Java或C#。 a后面的向量不会因myRow的更改而改变。

您似乎也将固定值作为myRow的第一个元素,并且 然后附加随机性。那是你的意思吗?

您需要的是:

    for (int i = 0; i < rowsInA; i++) {
        vector<int> myRow;
        myRow.reserve(columnsInA);
        myRow.push_back(0);  // First element fixed.
        for (int j = 1; j < columnsInA; j++) {
            const int x = rand() % 100;;
            myRow.push_back(x);
        }
        a.push_back(myRow);
    }

或者,使所有值随机,并直接使用向量:

    a.reserve(rowsInA);
    for (int i = 0; i < rowsInA; i++) {
        a.push_back( {} );
        a.back().reserve(columnsInA);
        for (int j = 0; j < columnsInA; j++) {
            const int x = rand() % 100;;
            a.back().push_back(x);
        }
    }

初始化B时遇到类似的问题,你的乘法循环需要将a[i][k] * b[k][j]累加到一个临时总和中,然后将其推到myRow,最后将myRow推到{{} 1}}。

最后,当你有这个工作时,查看如何编写一个Matrix类,它将所有数据存储在带有* cols元素的向量中,然后使用索引函数来引用它。你的缓存会感谢你。