thrust :: transform_reduce Как я могу получить доступ к итератору внутри унарной операции?

Я пытаюсь выполнить уменьшение преобразования для вектора структур. Структура содержит два числа. Я хочу, чтобы унарная функция что-то делала с этими двумя числами и возвращала по одному значению для каждой структуры в моем векторе и уменьшала с суммированием этих значений. Как мне написать свой функтор для доступа к значениям в структуре?

например, каков правильный синтаксис для mystruct.value1 внутри функции ?:

struct unary_op
{
float operator()()
{
return mystruct.value1 + mystruct.value2; //function is a lot more complex
}
}

так что я могу сделать:

unary_op uop1;
thrust::transform_reduce(myvec.begin(), myvec.end(), uop1, 0, thrust::add)

0

Решение

Отказ от ответственности:
Поскольку вы, очевидно, не опубликовали реальный код, а ваш пример выглядит как несколько не связанных строк кода, мой ответ может не соответствовать тому, что вы ищете — SSCCE было бы хорошо.

Если я правильно понимаю, вы хотите преобразовать вектор MyStructs к сумме всех значений элементов структуры. Для этого вам нужно двоичное дополнение (thrust::add) и унар MyStruct и возвращая сложение значений его членов:

struct MyStruct {
float value1;
float value2;
};
std::vector<MyStruct> myvec;

/* fill myvec */

//C++11 with lambdas:
auto result = thrust::transform_reduce(begin(myvec), end(myvec),
[](MyStruct const& ms) { //unary op for transform
return ms.value1 + ms.value2;
},
0, thrust::add);

//C++03 with a functor:
struct MyStructReducer {
float operator()(MyStruct const& ms) {
return ms.value1 + ms.value2;
}
};

float result = thrust::transform_reduce(myvec.begin, myvec.end(),
MyStructReducer(), 0, thrust::add);

Вы также можете использовать бесплатную функцию вместо класса Reducer.

//C++03 with a function:
float reduceMyStruct(MyStruct const& ms) {
return ms.value1 + ms.value2;
}

/* ... */
float result = thrust::transform_reduce(myvec.begin, myvec.end(),
reduceMyStruct, 0, thrust::add);

НТН

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]