Как я могу сделать точечный продукт между матрицей и вектором в с ++ - PullRequest
1 голос
/ 07 мая 2020

Есть функция под названием inner_product, но я с треском не смог ее использовать. Мне нужно будет использовать эту функцию несколько раз для разных матриц и векторов. Ниже мой текущий код:

std::vector<vector<int>> matrix_a = {{0, 0},
                                     {0, 1},
                                     {1, 0},
                                     {1, 1}};
std::vector<float> vector_b = {0.5, 0.8};

dot_produt(matrix_a, vettor_b);
float dot_produt(vector<vector<int>> e, vector<float> p){
    return std::inner_product(std::begin(e), std::end(e), std::begin(p), 0.0);
}

Процесс выглядит примерно так:

(0.5 * 0) + (0.8 * 0) + (0.5 * 0) + (0.8 * 1)... ...

Ожидаемый результат:

2.6

Ошибка:

no match for 'operator*' (operand types are 'std::vector<int>' and 'float')
__init = __init + (*__first1 * *__first2);

1 Ответ

1 голос
/ 07 мая 2020

Вы пытаетесь использовать указатели для начала и конца вектора векторов, inner_product требует указателей на начало и конец вектора.

Кроме того, векторы имеют свои собственные итераторы, вы можете их использовать вместо std::begin и std::end.

Live demo

#include <iostream>
#include <numeric>
#include <vector>

//passing vectors by reference avoids unnecessary copies
double dot_produt(const std::vector<std::vector<int>> &e, const std::vector<float> &p)
{
    double result = 0;
    for (auto& v : e) //range based loop
        result += std::inner_product(v.begin(), v.end(), p.begin(), 0.0);
    return result;
}

int main()
{
    std::vector<std::vector<int>> matrix_a = {{0, 0},
                                              {0, 1},
                                              {1, 0},
                                              {1, 1}};
    std::vector<float> vector_b = {0.5, 0.8};

    std::cout << dot_produt(matrix_a, vector_b); //test print
}

Вывод:

2.6
...