向量与矩阵的乘法在c ++

时间:2018-11-18 11:15:25

标签: c++

我试图将一个向量乘以一个矩阵,但由于循环总是停在一行,所以我无法使它起作用。但是没有错误代码,我尝试了不同的方法将代码写入结果向量中,但是它不起作用。输出用于控制循环的停止位置,在res [i] + =(A [i] [k] * B [k])之后停止。

这是执行矢量和矩阵乘法的特定功能,如果需要所有代码,请告诉我。

void vector_matrix_multiplication(vector<vector<int>> A,vector<int> B, int col1, int row1, int row2, vector<int>& res) {
int row = row1;
if(row1 < row2)
    row = row2;
for(int i = 0; i < row; i++) {
    cout << "Loop 1 ";
    cout << i << endl;
        for (int k = 0; k < col1; k++) {
            cout << "Loop 2 " << i << " " << k << endl;
            res[i] += (A[i][k] * B[k]);
            cout << "Loop 2?" << endl;
        }
}

函数的输出(输入A = {{{2,3},{4,5}}&B = {1,2})是:
循环1 0
循环2 0 0

#include <iostream>
#include <vector>
using namespace std;

void vectorinput(vector<int>& a, int col){
    cout << "Vector: " << endl;
    for(int i = 0; i < col; i++) {
        int x;
        cin >> x;
        a.push_back(x);
    }

}

void matrixinput(vector<vector<int>>& a, int row, int col){
    cout << "Matrix: " << endl;
    for(int i = 0; i < row; i++) {
       vector<int> vector;
       for(int j = 0; j < col; j++) {
           int x;
           cin >> x;
           vector.push_back(x);
        }
        a.push_back(vector);
    }
}

int main(){
vector<int> vector;
vector<vector<int>> matrix;  //Matrix is read in separate function

int row1 = 0;                //Number of rows of first matrix
int col1 = 0;                //Number of columns of first matrix
int row2 = 0;                //Number of rows second matrix (redundant in this case)
int col2 = 0;                //Number of columns second matrix

matrixinput(matrix1, row1, col1);
vectorinput(vector2, col2);

    int row = row1;    //Matrix with number of columns "col1", rows "row" - in this case both are 2
    if(row2 > row1)
        row = row2;    //Vector with number of rows "row2" - in this case 2
    vector<int> resvector(row, col1);
    vector_matrix_multiplication(matrix2, vector1, col2, row, col1, resvector);
    for(int i = 0; i < row; i++) {
        cout << resvector[i] << endl;
    }
return 0;  
}

我希望这可以弄清楚程序和功能的目的。我尝试将其缩减一些,因为其中包含许多无用的代码。 (另外,我一开始很难输入代码,还不确定代码块的工作方式-抱歉^^)

2 个答案:

答案 0 :(得分:0)

欢迎来到StackOverflow!我建议您将数学库用于此类工作。原因是:

  • 他们已经被别人测试了
  • 它们高效且经过优化,可以使用高级CPU功能
  • 它们更易于使用

我使用了两个不同的库:glmEigen

如果您想构建自己的库用于学习,我建议您看看这些库的编写方式(它们是开源的)

答案 1 :(得分:0)

您的代码中存在以下三个错误:

  • 由于您使用了std::vector

    的以下ctor
    explicit vector(size_type count, 
                    const T& value = T(),
                    const Allocator& alloc = Allocator());
    

    resvector的第二个参数必须为零。

  • row1row2col1col2在主函数中全为零,因此vector_matrix_multiplication中的循环不起作用。 我们还可以将这些变量减少为@ n.m到矩阵的rowcol。在评论中提出建议。

  • matrix1matrix2vector1vector2未定义。

总而言之,以下最低限度固定的版本将很适合您:

int main()
{
    std::vector<int> vec;
    std::vector<std::vector<int>> mat;

    int row = 2; //Number of rows of matrix
    int col = 2; //Number of columns of matrix

    matrixinput(mat, row, col);
    vectorinput(vec, col);

    std::vector<int> resvector(row, 0);

    // 5th argument is redundant as @n.m. suggested
    vector_matrix_multiplication(mat, vec, col, row, col, resvector);
    for(int i = 0; i < row; i++) {
        std::cout << resvector[i] << std::endl;
    }

    return 0;  
}