1

Matlab から C++ へのコード変換の最中です。いくつかの重要な理由から、平均 = 0 および分散 = 1 の「正規」関数 (matlab では「ノルム」) の累積分布関数を取得する必要があります。

Matlab での実装は次のようなものです。

map.c = cdf( 'norm', map.c, 0,1 );

これは、map.c からのヒストグラムの均等化であると想定されます。

私が持っている小数がないため、問題はC ++に変換するときに発生します。ここで見つけた C++ コード、C/C++ の累積正規分布関数など、多くの典型的な cdf 実装を試しました が、小数が大幅に不足していたため、boost 実装を試しました。

#include "boost/math/distributions.hpp" 

boost::math::normal_distribution<> d(0,1);

それでも、Matlab のものと同じ実装ではありません (さらに正確に思われると思います!)

そのようなプロセスの元のMatlabソースがどこにあるか、または考慮すべき正しい小数点以下の量を知っている人はいますか?

前もって感謝します!

4

3 に答える 3

1

ガウスCDFは興味深い関数です。私の答えがあなたの興味を引くかどうかはわかりませんが、後であなたの質問を調べる他の人の興味を引く可能性が高いので、ここにあります。

PDFのテイラー級数を用語ごとに統合することでCDFを計算できます。このアプローチは、ガウスベル曲線の本体でうまく機能しますが、テールで数値的に失敗するだけです。尻尾には、特殊機能のテクニックが必要です。私がこれについて読んだ最高の情報源は、NNレベデフの特殊機能とその応用、Ch。2、ドーバー、1972年。

于 2012-06-04T15:41:25.223 に答える
1

OctaveはオープンソースのMatlabクローンです。Octaveの実装のソースコードは次のとおりです。http normcdf//octave-nan.sourcearchive.com/documentation/1.0.6/normcdf_8m-source.html

それがあなたを助けるならば、それは(ほとんど)Matlabのものと同じであるはずです。

于 2012-06-04T15:36:45.740 に答える
0

long doubleより正確な浮動小数点型のCおよびC++サポート。実装でそれを使用してみることができます。コンパイラのドキュメントをチェックして、さらに高精度の浮動小数点型が提供されているかどうかを確認できます。GCC 4.3以降__float128では、さらに精度が高くなっています。

于 2012-06-04T15:26:37.293 に答える