使用 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
甚至 >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 的向量元素乘积的主要内容,如果未能解决你的问题,请参考以下文章