1

浮動小数点数を任意のビンに分類するクラスを探しています。ビン。望ましい構文は次のようになります。

std::vector<double> bin_vector;

// ..... fill the vector with 1, 1.4, 5, etc not evenly spaced values

Binner bins(bin_vector); 

for (std::vector<double>::const_iterator d_itr = some_vector.begin(); 
     d_itr != some_vector.end(); d_itr++) { 
  int bin = bins.categorize(*d_itr); 

  // bin would be 0 for x < 1, 1 for 1 < x < 1.4, etc
  // do something with bin
}

残念ながら、移植性の要件により、boost と stl に制限されています。カスタム範囲オブジェクトのマップとオーバーロードを使用して、独自の O(log n) ソリューションを作成し<ましたが、そのソリューションはバグが発生しやすく、せいぜい醜いようでした。

これに対する単純な stl または boost オブジェクトのソリューションはありますか?

4

2 に答える 2

4

std :: mapを使用して、間隔の境界をビン番号にマッピングします。次に、.upper_bound()を使用してビンを見つけます。

于 2012-04-25T07:19:46.950 に答える
0

以下は、任意の長さ M の入力ベクトルと N-1 ビン境界の並べ替えられたベクトルを取り、N ビン カウントのベクトルを返すテストされていない一般的なアルゴリズムです。ビン i は、間隔 [breaks[i-1]、breaks[i]) の値をカウントします。タイプ T1 と T2 は相互に比較可能でなければなりません。複雑さは O(M * log (N)) に等しくなります。

#include<algorithm>     // std::is_sorted, std::lower_bound
#include<cassert>       // assert
#include<iterator>      // std::distance
#include<vector>        // std::vector

template<typename T1, typename T2>
std::vector<std::size_t> bin_count(const std::vector<T1>& input, const std::vector<T2>& breaks)
{
    // breaks is a sorted vector -INF < a0 < a1 < ... < aN-2 < +INF
    assert(std::is_sorted(breaks.begin(), breaks.end()));
    auto N = breaks.size() + 1;

    std::vector<std::size_t> output(N, 0);

    if (N == 1) {
        // everything is inside [-INF, INF)
        output[0] = input.size();
        return output;
    }

    for(auto it = input.begin(), it != input.end(); ++it) {
        if (*it < breaks.front()) {
            // first bin counts values in [-INF, a0)
            ++output[0];
            break;
        }
        if (*it >= breaks.back()) {
            // last bin counts values in [aN-1, +INF)
            ++output[N-1];
            break;
        }

        const auto break_it = std::lower_bound(breaks.begin(), breaks.end(), *it);
        bin_index = std::distance(breaks.begin(), break_it) + 1;
        ++output[bin_index];
    }

    return output;  
}
于 2012-04-25T08:07:17.853 に答える