4

私は現在、読み込んでいるいくつかのデータに対して、(さまざまな位相空間での正規化に基づいて) 一連の変数に対して複雑な変数補正を実行しようとしています。各補正は同じプロセスに従うため、とにかく、各変数を単独で処理するのではなく、これを繰り返し実行します (約 18 ~ 20 個の変数に対してこれを行う必要があるため)。C++ でこれを処理できますか? これを Python でやってみるように誰かに言われたのですが、C++ でも何とかできるような気がします... 壁にぶち当たりました!

あなたにアイデアを与えるために、次のようなものが与えられます:

class VariableClass{
    public :
      //each object of this class represents an event for this particlular data set 
      //containing the following variables
      double x;
      double y;
      double z;
}

私は次の行に沿って何かをしたい:

for (int i=0; i < num_variables; i++)
{
   for (int j=0; j < num_events; j++)
   {
     //iterate through events
   }
   //correct variable here, then move on to next one
}

アドバイスをよろしくお願いします!!!

4

5 に答える 5

3

メンバー変数がすべて同じ型を持つとは限らないと思います。それ以外の場合は、それらをコンテナーに入れるだけです。C++11 を使用している場合、この問題を解決できる 1 つの方法はtupleです。いくつかのテンプレート メタプログラミングを使用すると、タプルのすべての要素に対するループをシミュレートできます。関数std::tieは、次のように「反復」できるすべてのメンバーへの参照を含むタプルを構築します。

struct DoCorrection
{
    template<typename T>
    void operator()(T& t) const { /* code goes here */ }
};

for_each(std::tie(x, y, z), DoCorrection());
// see linked SO answer for the detailed code to make this special for_each work.

operator()次に、メンバー変数の型ごとに特化できます。これにより、タイプを手動で追跡しなくても、適切な計算を自動的に行うことができます。

于 2013-02-25T21:01:52.193 に答える
2

glmから取得(詳細vec3.incl)

template <typename T>
GLM_FUNC_QUALIFIER typename tvec3<T>::value_type & 
tvec3<T>::operator[]
(
    size_type i
)
{
    assert(i < this->length());
    return (&x)[i];
}

これはあなたの例に変換されます:

class VariableClass{
public :
  //each object of this class represents an event for this particlular data
  double x;
  double y;
  double z;

  double & operator[](int i) {
    assert(i < 3);
    return (&x)[i];
  }
}

VariableClass foo();
foo.x = 2.0;
std::cout << foo[0] << std::endl; // => 2.0

glmをお勧めしますが、それがベクトル数学に関するものであれば。

于 2013-02-25T20:42:17.023 に答える
1

std::vectorはい、すべての変数を、たとえばのようなコンテナに入れるだけです。

于 2013-02-25T20:35:16.917 に答える
1

http://en.cppreference.com/w/cpp/container/vector

すべての std クラスについて読むことに時間を費やすことをお勧めします。多くの容器と多くの用途があります。

于 2013-02-25T20:40:30.907 に答える
0

一般に、パディングや異なるアクセス修飾子を使用したセクションの並べ替えなどの実装定義に依存せずにメンバーを反復処理することはできません (文字通り、後者を行うコンパイラはありませんが、許可されています)。

ただし、レコード タイプの一般化である a を使用できますstd::tuple。タプルの繰り返しは簡単ではありませんが、それを行うコードはたくさんあります。ここで最悪なのは、メンバーで模倣できる名前付き変数が失われることです。

Boost を使用する場合は、Boost.Fusion のヘルパー マクロBOOST_FUSION_ADAPT_STRUCTを使用して構造体を Fusion シーケンスに変換し、それを Fusion アルゴリズムで使用できます。

于 2013-02-25T20:55:53.193 に答える