如何使用 C++ STL 算法重写嵌套循环
How to rewrite a nested loop using the C++ STL algorithms?
这个循环很简单,但我似乎无法使用 STL 算法来给出下面的相同嵌套循环。
const int a_size = 5; // input
const int c_size = 2; // output
const int b_size = a_size * c_size; // multipliers
std::vector<float> a(a_size);
std::vector<float> b(b_size);
std::vector<float> c(c_size);
// fill a and b with data
// this nested loop
for(int i = 0; i<c_size; i++) {
c[i] = 0.0;
for(int k = 0; k<a_size; k++) {
c[i] += (a[k] * b[i*a_size+k]);
}
c[i] = sigmoid(c[i]);
}
我想这样做的原因是 Boost.Compute 库,它将使用类似 STL 的算法(std::transform、std::for_each 等)在 GPU 上进行计算。
实际上嵌套循环是算法std::inner_product。
auto first = std::begin( b );
auto increment = std::distance( std::begin( a ), std::end( a ) );
//,,
c[i] = std::inner_product( std::begin( a ), std::end( a ), first, 0 );
std::advance( first, increment );
代替外部循环,您可以使用算法 std::generate。
我想
出了:
auto i = 0;
generate(begin(c), end(c), [&i, &a, &b]
{
return sigmoid(inner_product
(
begin(a), end(a),
begin(b) + distance(begin(a), end(a)) * i++, 0.f
));
});
但它看起来不太好 - 可能在这种情况下,我更愿意编写自己的算法。
或者使用矩阵形式。有了Eigen
库,它将变成:
MatrixXd b;
VectorXd a, c;
// ...
c = (b*a).unaryExpr(sigmoid);
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 了解嵌套循环打印星号图案
- 无法掌握嵌套循环的写作技巧
- 在 c++ 中实现嵌套循环的更短方法吗?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 毕达哥拉斯三重嵌套循环误解
- T(n) 表示嵌套循环
- 2 个嵌套循环的时间复杂度
- 嵌套循环背后的逻辑
- 使用 %s C++嵌套循环
- 嵌套循环和重复迭代器
- 如何在 c++ 下使用嵌套循环和正则表达式降低时间复杂度?
- C++在乘法图中放置随机值(嵌套循环)
- 如何使用 OpenMP 减少嵌套循环?
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 学习嵌套循环C++与示例混淆
- 如何在CUDA中嵌套循环
- std::vector上的嵌套循环
- 如何将3个嵌套循环重写为一个
- 如何使用 C++ STL 算法重写嵌套循环