1

量子力学用の小さなライブラリを作成しており、式テンプレートを使用して演算子式を形成したいと考えています。特に式テンプレートを使用したハミルトニアンの形成。

私は基本的にこのソースに従ってコードを構築し、対応する演算子をオーバーロードしました + * -: https://en.wikipedia.org/wiki/Expression_templates

ハミルトニアンの式を形成するには合計が必要です

Vec x = u_1 + u_2 + ... + u_N

ここで、N は (const) 整数で、u_i も Vec 型です。この式をコードに記述しても機能しますが、記述できるようにしたいと思います

Vec x = Sum_{i=0}^{N} u_i

どうすればこれを行うことができますか?

- - - - - - 編集 - - - - - -

いくつかの調査とコメントの助けを借りて、静的 for ループのアイデアを思いつきました...グーグルで調べた後、http://www.drdobbs.com/loops-metaloops-c/184401835?pgnoで記事を見つけました=8これはまさに私が必要としていたものです。

4

1 に答える 1

0

周囲のスコープの変数を魔法のようにパターン マッチングするテンプレートまたは関数を作成する方法がないため、u_i構文が機能しません。マクロを使用して同様のことを行うことができます。たとえば、次のようになります。

#define SUM_4(x) x ## 1 + x ## 2 + x ## 3 + x ## 4

使用法:

Vec u_1, u_2, u_3, u_4;
...
Vec x = SUM_4(u_);

他の数のソース ベクトルに対して追加のマクロを定義する必要があります。

C++ の添字演算子は、配列アクセスによってモデル化されますu[1], u[2], ...。の配列を維持したい場合は、配列Vecを反復処理する汎用関数を作成できます。この場合、パラメータは配列になります。何かのようなもの:

template<typename T, int N>
T sum(T (&u)[N])
{
    // (or your preferred summation procedure)
    T x = u[0];
    for (int i=1; i < N; ++i)
        x += u[i];
    return x;
}

使用法:

Vec u[4];
...
Vec x = sum(u);

std::vectorまたは固定サイズの配列テンプレートを使用することをお勧めします。

PS Eigen の使用を検討してください

編集: http://www.cplusplus.com/articles/D4SGz8AR/sum()からの配列サイズ控除で更新されたテンプレート

于 2015-10-17T13:19:08.180 に答える