我有一个很长的双打向量
x[]
。我有另一个长布尔向量xMask[]
。它们具有相同的尺寸。我想使用 Thrust 来计算 x[]
的最大值,但仅适用于 xMask[]
为真的那些元素。例如:
x = [1, 2, 3, 4, 5, 6, 7, 8]
xMask = [true, false, true, false, true, false, true, false]
x[]
和 xMask[]
的最大减少是 7(不是 8,因为 xMask[]
的值是 false
)。
我可以在 Thrust 中轻松做到这一点吗?
到目前为止,在 Thrust 中没有名为
reduce_if
的函数,这将是您要搜索的函数。使用给定的函数有多种方法可以做到这一点,哪种方法最适合您的问题可能取决于面罩中 true
s 与 false
s 的比例以及它们的分布方式。
话虽如此,实现这一目标的规范方法是将
transform_reduce
与 zip_iterator
一起使用:
#include <thrust/device_vector.h>
#include <thrust/functional.h>
#include <thrust/transform_reduce.h>
#include <thrust/zip_iterator.h>
int reduce_if(thrust::device_vector<int> const &data,
thrust::device_vector<bool> const &mask) {
return thrust::transform_reduce(
thrust::make_zip_iterator(thrust::make_tuple(
data.cbegin(), mask.cbegin())),
thrust::make_zip_iterator(thrust::make_tuple(
data.cend(), mask.cend())),
[](const thrust::tuple<int, bool> &elem){
return thrust::get<1>(elem) ? thrust::get<0>(elem) : 0;
},
0,
thrust::plus<int>{});
}