24

私は Matlab 以外であまりコーディングを行いませんが、Matlab コードを別の言語 (おそらく C) にエクスポートする必要があります。私の Matlab コードには、入力データを配置するヒストグラム関数 histc() が含まれています (これは double -精度、整数ではありません) をビンの指定された配列に変換して、ヒストグラムを形成します。

いくつかのネストされたループをつなぎ合わせてヒストグラム関数を生成できると確信していますが、この関数は繰り返し頻繁にアクセスされるため、高速でメモリが少ない必要があります。

車輪の再発明を避けるために、C言語に使用可能な既存のヒストグラム関数があるかどうか、またはそのようなものを必要とする人々が一般的にそれを自分で作成するかどうかを知っている人はいますか?

ヒストグラムを作成するための効率的なアルゴリズムを知っている人はいますか? 擬似コードは問題ありません。

前もって感謝します。

4

3 に答える 3

20

「理想的な」ヒストグラム アルゴリズムは、キャプチャする予定の範囲によって異なります。通常、ヒストグラム アルゴリズムは次のようになります。

const int NSAMPLES = whatever;
double samples[NSAMPLES] = { 1.0, 3.93, 1e30, ... }; // your data set
const int NBUCKETS = 10; // or whatever
int counts[NBUCKETS] = { 0 };
for (int i = 0; i != NSAMPLES; ++i) {
    counts[TRANSFER(samples[i])]++;
}

ここでTRANSFER()、入力をビンにマップする関数があります(適用可能な「範囲外」への0番目またはN番目のビンマッピング)。

の正確な実装はTRANSFER()、サンプルの予想される分布と詳細に関心のある場所に大きく依存します。私が見たいくつかの一般的なアプローチ:

  • 範囲 [a,b] の一様分布 (線形変換が必要)
  • 符号なし整数値の対数分布 (最も近い 2 の累乗などをすばやく判断するために、いくつかのビットいじりハックと組み合わせると最適です)。

事前に分布がわからない場合は、それらを効果的にビン化するための効率的なメカニズムを実際に持つことはできません。推測する (偏った結果または有益でない結果) か、すべてを保存して最後に並べ替える必要があります。同じサイズのバケットへのビニング (パフォーマンスの低下)。

于 2010-12-23T05:26:31.790 に答える
16

GSL (GNU Scientific Library) には、ヒストグラムの実装が含まれています。

ドキュメントは次のとおりです: http://www.gnu.org/software/gsl/manual/html_node/Histograms.html

使用例は次のとおりです: http://www.gnu.org/software/gsl/manual/html_node/Example-programs-for-histograms.html

于 2010-12-23T04:37:15.997 に答える
14

独自のヒストグラムコードをCで記述しました。これは、ライブラリを探すことすら考えられなかったほど単純なためです。通常は、必要なビンの数を含む配列を作成する必要があります[ num_bins = (int)(max_val - min_val + 1);]。各サンプルに遭遇したら、ビンの数[ bin_idx = (int)((value - min_val) / bin_width);](ここでbin_width = (max_val - min_val)/num_bins)で除算して、それが属する場所を見つけ、ビンカウンターをインクリメントできます。 。これは、データの簡単で高速なシングルパスです。上記の算術演算でエッジケースを確認してください。

発生する可能性のある問題は、入力のドメインが不明である可能性があることです。doubleすべてのデータがそのごく一部の範囲内にある場合、範囲全体で100個のビンを使用することはあまり効果的ではありません。解決策は、データを最初に通過させて、範囲の最小値/最大値を見つけることです。これに対する迅速な修正は実際にはなく、ほとんどのライブラリは事前に最小/最大を要求します。

于 2010-12-23T04:54:48.553 に答える