如何在 C++ 中的矩阵和向量之间进行点积

Posted

技术标签:

【中文标题】如何在 C++ 中的矩阵和向量之间进行点积【英文标题】:How can I do a dot product between a matrix and a vector in c++ 【发布时间】:2020-05-06 21:12:53 【问题描述】:

有一个名为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&lt;int&gt;s 和 floats 不是你可以算术比较的吗? 我的印象是点积在两个向量之间。您可以在矩阵的行和列上使用点积,但不能在整个矩阵上使用。 【参考方案1】:

您正在尝试使用指针来指向向量向量的开头和结尾,inner_product 需要指向向量开头和结尾的指针。

此外,向量有自己的迭代器,您可以使用它们来代替std::beginstd::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

【讨论】:

以上是关于如何在 C++ 中的矩阵和向量之间进行点积的主要内容,如果未能解决你的问题,请参考以下文章

如何在Mexfile中的matlab(矩阵,单元格)和c ++(向量或自定义类)之间正确转换变量

向量点积和叉积(向量积)

如何在 Python 中矢量化点积?

如何在 C++ 中的矩阵中搜索向量以及哪种算法?

C++ 中的点积实现

如何在 C++ 中对向量组元素进行排序?