1

構造体のベクトルに対して変換削減を実行しようとしています。構造体には2つの数値が含まれています。単項関数がこれらの2つの数値を使用して何かを実行し、ベクトル内の構造体ごとに1つの値を返し、これらの値の合計で削減する必要があります。構造体の値にアクセスするためのファンクターを作成するにはどうすればよいですか?

たとえば、関数内の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)
4

1 に答える 1

2

免責事項: あなたは明らかに実際のコードを投稿しておらず、あなたの例はいくつかの無関係なコード行のように見えるので、私の答えはあなたが探しているものではないかもしれません-SSCCEは良かったでしょう。

私が正しく理解していれば、MyStructsのベクトルをすべての構造体メンバーの値の合計に変換する必要があります。thrust::addこれを行うには、バイナリ加算( )と単項演算が必要です。aを取り、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クラスの代わりにfree関数を使用することもできます。

//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);

HTH

于 2013-02-14T07:48:03.970 に答える