如何在C++中实现矩阵与向量的点积

3

有一个名叫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);

我不太明白你为什么期望这段代码能够直接运行。vector<int>float并不是可以进行算术比较的类型? - Asteroids With Wings
我曾认为点积是两个向量之间的运算。你可以在矩阵的行和列上使用点积,但不能对整个矩阵进行操作。 - Kenny Ostrom
1个回答

3
你正在尝试使用指向向量的向量开头和结尾的指针,而 inner_product 需要指向向量开头和结尾的指针。
此外,向量有它们自己的迭代器,你可以使用它们代替 std::beginstd::end演示链接
#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

一个关于 https://github.com/zlatnaspirala/bvh-loader/issues/1 的建议,我需要3x3点乘3x3。 - Nikola Lukic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接