使用 C++ 和 STL 的向量元素乘积

Posted

技术标签:

【中文标题】使用 C++ 和 STL 的向量元素乘积【英文标题】:vector element-wise product with C++ and STL 【发布时间】:2012-07-31 10:21:52 【问题描述】:

在 C++ 中实现元素乘积并不难:

vector<float> a_array;
vector<float> b_array;
vector<float> c_array;
vector<float> dot_array;
....
for(int i=0; i<a_array.size(); i++)

   float temp;
   temp = a_array[i]*b_array[i]*c_array[i];
   dot_array[i] = temp;

这是一个非常简单的实现,我想知道 STL 中是否已经有更高效的算法可用。谢谢!

【问题讨论】:

这不是点积。 您的意思是两个或多个向量的元素乘积。点积(又名标量或内积)是 sum(a[i]*b[i]),这不是您的代码所做的。 谢谢,我把问题的内容改了 这种概括真的很难写。 inner_product 适用于 2 个向量,但不适用于 n 甚至 &gt;2。在C++11 中可以定义n-ary 算法来做你想做的事情。 看过人们的答案后,我不会说 STL 算法更有效。它们的作用与您几乎相同,但也包括会影响效率的开销。 【参考方案1】:

std::transform 可用于将两个向量相乘:

#include <algorithm>
#include <functional>

// Precondition: b.size() >= a.size() && r.size() >= a.size()
std::transform(a.begin(), a.end(), b.begin(), r.begin(), std::multiplies<float>());

没有超过两个输入序列的类似标准算法。

【讨论】:

2 个问题:a[i] 和 b[i] 的乘积是否被复制到 r[i] 中——还是被移动了?可以用 a.begin() 替换 r.begin() (覆盖 a)吗? 该产品以前从未存储在任何地方,因此既没有复制也没有移动。是的,我相信您可以将输出设置为与输入相同,它会进行适当的转换。【参考方案2】:

看看std::inner_product。

编辑当问题是关于点积时,我发布了这个答案。有关元素产品,请参阅std::transform 的第二版。

【讨论】:

谢谢,但我对点积感兴趣。 @feelfree 在这种情况下,内积和点积是一样的。【参考方案3】:

std::vector 类实际上不是一个数学向量,而是一个动态大小的数组,一个集合。你可能会因为它的名字而感到困惑。最好定义一个真正的vector 类来实现数学运算,而不是(错误地)使用std::vector

【讨论】:

以上是关于使用 C++ 和 STL 的向量元素乘积的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的向量中查找() stl

c++中向量中的元素除法

C++:问题向量 STL

寻找类似 C++ STL 的向量类但使用堆栈存储

C++ STL 中向量的恒定时间交换逻辑

PyTorch 向量/矩阵/张量的元素乘积