この問題があります(ヒストグラム)。私は実際のスペースを持っています:[a,b]
何らかの方法で分割されています ( [a0=a, a1, a2, ..., b]
)。パーティショニングは、等間隔 ( a1 - a0 = a2 - a1 = ...
) または変数で行うことができます。
これを処理するクラスが必要です。それが属するパーティションのビンの値を指定して、いくつかのメソッドを使用します。特定のビンなどの中心を見つける他の方法。
プログラム中に、次のような単純な関数を呼び出すためだけにクラスをインスタンス化するのは好きではありません
Binner binner(binning);
binner.get_bin(1.3);
binner.get_centerbin(2);
だから私はそのようなことをするためにテンプレートを使って静的クラスを書こうとしました:
Binner<binning>::get_bin(1.3);
Binner<binning>::get_centerbin(2);
それは良い考えですか?それを行う他の方法はありますか?今、私は次のような無料の機能を持っています
double get_bin(double bin, Binning binning); // a lot of if/else inside
しかし、エラーが発生しやすいと思います。
ここで私の実装:
enum Binning {CELL, LARGE, BE};
const double binning_LARGE[] = {0, 1.2, 1.425, 1.550, 1.800, 2.5};
const double binning_BE[] = {0, 1.425, 1.550, 2.5};
template<Binning binning>
class Binner
{
public:
static const double* bins;
static const int n;
static int get_bin(double value);
};
template<> const double* myclass<LARGE>::bins = binning_LARGE;
template<> const double* myclass<BE>::bins = binning_BE;
template<> const int myclass<LARGE>::n = sizeof(binning_LARGE) / sizeof(double);
template<> const int myclass<BE>::n = sizeof(binning_BE) / sizeof(double);
template<Binning binning> int myclass<binning>::get_bin(double value)
{
return find_if(bins, bins + n,
bind2nd(greater<double>(), value)) - bins - 1;
}
template<> int myclass<CELL>::get_bin(double value)
{
return static_cast<int>(value / 0.025);
}
- それは良い実装/設計ですか?
n
を使用してフィールドを回避する方法はありstd::vector
ますか? どのように?をパラメータ化する方法はあり
0.025
ますか?double
テンプレートパラメータにできないことはわかっていますが、次のようなものを書くことはできますか:Binner<0.025> binner;
- その他/アドバイス?
編集:
3番目のポイントについてなぜ私はそれができないのか:
template<Binning binning, int N=100>
class Binner
{
public:
static const double* bins;
static const int n;
static int bin(double value);
};
...
template<Binning binning, int N> int Binner<CELL, N>::bin(double value)
{
return static_cast<int>(value / (2.5 / N));
}