C++ 向量矩阵乘法

C++ 向量矩阵乘法,c++,matrix,C++,Matrix,我在试着乘矩阵。这条线是A[i][j]。布设_backi*j;导致此错误的原因: IntelliSense:表达式必须具有类类型 这个代码怎么了?我还尝试了推回功能 #include "stdafx.h" #include <iostream> #include <vector> using namespace std; using matrix = vector<vector<double>>; matrix multiple(matrix

我在试着乘矩阵。这条线是A[i][j]。布设_backi*j;导致此错误的原因:

IntelliSense:表达式必须具有类类型

这个代码怎么了?我还尝试了推回功能

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;
using matrix = vector<vector<double>>;

matrix multiple(matrix A, matrix B);
void initialize(matrix& A, matrix& B);


int _tmain(int argc, _TCHAR* argv[])
{
    matrix A;
    matrix B;
    initialize(A, B);
    matrix C = multiple(A, B);
    return 0;
}

matrix multiple(matrix A, matrix B)
{
    matrix C;
    for (int i = 0; i < A.size(); ){
        for (int j = 0; j < B.size(); ){
            for (int k = 0; k < A.size();k++)
                C[i][j] += A[i][k] * B[k][j];
        }
    }
    return C;
}

void initialize(matrix& A, matrix& B)
{
    for (int i = 0; i < A.size(); i++){
        for (int j = 0; j < B.size(); j++){
            A[i][j].emplace_back(i*j);
            B[i][j].emplace_back(i*j);
        }
    }
}
A[i][j]实际上只是一个double,因此它没有任何名为emplace_back的成员函数,这就是为什么会出现错误

因为您已经有了索引,所以可以直接将元素放入:

void initialize(matrix& A, matrix& B)
{
    for (int i = 0; i < A.size(); i++){
        for (int j = 0; j < B.size(); j++){
            A[i][j] = i*j;
            B[i][j] = i*j;
        }
    }
}

或者,您可以使用嵌套的std::数组以及包含维度的模板。

这里是一个模板类,因此vector可以是int或double

template <class T>
std::vector <std::vector<T>> Multiply(std::vector <std::vector<T>> &a, std::vector <std::vector<T>> &b)
{
    const int n = a.size();     // a rows
    const int m = a[0].size();  // a cols
    const int p = b[0].size();  // b cols

    std::vector <std::vector<T>> c(n, std::vector<T>(p, 0));
    for (auto j = 0; j < p; ++j)
    {
        for (auto k = 0; k < m; ++k)
        {
            for (auto i = 0; i < n; ++i)
            {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return c;
}



std::vector <std::vector<double>> a (2, std::vector<double>(2));
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;

std::vector <std::vector<double>> b(2, std::vector<double>(2));
b[0][0] = 5;
b[0][1] = 6;
b[1][0] = 7;
b[1][1] = 8;

auto c = Multiply(a, b);

A[i][j]实际上只是一个双精度数,因此它没有任何名为emplace_back的成员函数。这就是为什么会出现错误的原因。可能您希望将emplace_back与A[i]和B[i]一起使用。另一个逻辑错误是,A和B的大小最初为0,因此即使您设法编译它,您的初始化函数也不会执行任何操作。@AlexFarber,很好的一点,我第一次错过了这一点。我想这是一个很好的例子,说明了为什么人们应该先编译代码,然后把问题和编译器的输出一起发布。那么为什么我可以使用a.size?@Kulis,因为a是一个包含向量的向量。您可以使用matrix=vector;从typedef中看到这一点;。
template <class T>
std::vector <std::vector<T>> Multiply(std::vector <std::vector<T>> &a, std::vector <std::vector<T>> &b)
{
    const int n = a.size();     // a rows
    const int m = a[0].size();  // a cols
    const int p = b[0].size();  // b cols

    std::vector <std::vector<T>> c(n, std::vector<T>(p, 0));
    for (auto j = 0; j < p; ++j)
    {
        for (auto k = 0; k < m; ++k)
        {
            for (auto i = 0; i < n; ++i)
            {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return c;
}



std::vector <std::vector<double>> a (2, std::vector<double>(2));
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;

std::vector <std::vector<double>> b(2, std::vector<double>(2));
b[0][0] = 5;
b[0][1] = 6;
b[1][0] = 7;
b[1][1] = 8;

auto c = Multiply(a, b);