c++ - 如何在没有冗余计算的 if 语句中使用 std::valarray?
问题描述
我有以下代码float
,例如:
std::vector<float> v = {0.f, 1.f, 2.f};
for(size_t i = 0; i < v.size(); ++i)
if(v[i] != 0) // An optimization for `v[i] != 0`.
v[i] = v[i] * v[i] * v[i]; // Time-consuming computation.
现在我想替换float
为std::valarray<float>
:
using vfloat = std::valarray<float>;
std::vector<vfloat> v = {vfloat{0.f, 0.f}, vfloat{1.f, 0.f}, vfloat{2.f, 0.f}};
for(size_t i = 0; i < v.size(); ++i)
// if(v[i] != 0) // I want this optimization! ◀◀◀◄◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀
v[i] = v[i] * v[i] * v[i]; // Time-consuming computation.
虽然新代码在逻辑上是正确的,但对于v[i][j] == 0
.
那么如何在没有冗余计算的情况下使用std::valarray
inif
语句呢?
解决方案
如果你想跳过v[i]
使用嵌套循环的元素
using vfloat = std::valarray<float>;
std::vector<vfloat> v = {vfloat{0.f, 0.f}, vfloat{1.f, 0.f}, vfloat{2.f, 0.f}};
for(size_t i = 0; i < v.size(); ++i)
for(size_t j = 0; j < v[i].size(); ++j)
if (v[i][j] != 0)
v[i][j] = v[i][j] * v[i][j] * v[i][j]; // Time-consuming computation.
或apply
:
using vfloat = std::valarray<float>;
std::vector<vfloat> v = {vfloat{0.f, 0.f}, vfloat{1.f, 0.f}, vfloat{2.f, 0.f}};
for(size_t i = 0; i < v.size(); ++i)
v[i] = v[i].apply([](float n) -> float {
if (n == 0) return 0;
return n * n * n; // Time-consuming computation.
});
如果你想跳过元素v
using vfloat = std::valarray<float>;
std::vector<vfloat> v = {vfloat{0.f, 0.f}, vfloat{1.f, 0.f}, vfloat{2.f, 0.f}};
for(size_t i = 0; i < v.size(); ++i)
if ((v[i] != 0).max() != 0)
v[i] = v[i] * v[i] * v[i]; // Time-consuming computation.
推荐阅读
- python - PyTorch 最有效的 Jacobian/Hessian 计算
- javascript - 视差滚动 - 降低容器的高度以匹配变换间隙
- excel - 是否可以用唯一的颜色为每组重复值着色?
- java - API 级别低于 26 的通知代码
- java - 将简单地图转换为地图列表的地图
- svelte - 在一个主要对象中对不同商店进行分组的最佳方法 - Svelte
- python - 为什么 Keras(或 Pillow)将我的 .jpg 文件作为 MPO 读取?
- javascript - 当从一台服务器向另一台服务器发出 http 请求时,Catch 回调运行而不是 then 回调
- android - Android LiveData 观察被多次调用
- c++ - 为什么我没有得到一个连续的情节?