Я определил следующий функциональный объект:
struct Predicate1
{
__device__ bool operator ()
(const DereferencedIteratorTuple& lhs, const DereferencedIteratorTuple& rhs)
{
using thrust::get;
//if you do <=, returns last occurence of largest element. < returns first
if (get<0>(lhs)== get<2>(lhs) && get<0>(lhs)!= 3) return get<1>(lhs) < get<1>(rhs);
else
return true ;
}
};
где DereferencedIteratorTuple выглядит следующим образом:
typedef thrust::tuple<int, float,int> DereferencedIteratorTuple;
Более того, я называю это следующим образом:
result = thrust::max_element(iter_begin, iter_end, Predicate1());
Но результатом является кортеж (3, .99,4). Я запутался, почему это результат, потому что условие get<0>(lhs)== get<2>(lhs)
не держит в if
для этого кортежа. Таким образом, оператор возвращает true для каждого сравнения этого кортежа. Тем не мение, thrust::max_element
определяется следующим образом:
«Эта версия сравнивает объекты, используя объект функции comp.
В частности, эта версия max_element возвращает первый итератор i
в [first, last) так, что для каждого итератора j в [first, last)
comp (* i, * j) ложно. «
Таким образом, нет способа выбрать это, поскольку для этого кортежа оператор никогда не возвращает false. Пожалуйста, дайте мне знать, что я делаю неправильно
Предикат помогает алгоритму определить, какой элемент выбрать. Если предикат возвращается true
алгоритм предпочитает rhs
над lhs
, Если он вернется false
алгоритм предпочитает lhs
над rhs
, В случае, когда предикат всегда возвращается true
алгоритм выберет последний элемент в массиве. Это верно как для алгоритмов stl, так и для тяги.
Я думаю, что ваш результат никогда не происходил как lhs
во время процесса сравнения, и каждый раз он не был отфильтрован, так как второе значение rhs было меньше 0,99.
Если вы хотите отфильтровать такие значения, вам лучше переписать свой предикат.
Других решений пока нет …