28 #ifndef mrpt_math_distributions_H
29 #define mrpt_math_distributions_H
44 using namespace mrpt::utils;
60 template <
class VECTORLIKE1,
class VECTORLIKE2,
class MATRIXLIKE>
63 const VECTORLIKE1 & x,
64 const VECTORLIKE2 & mu,
65 const MATRIXLIKE & cov_inv,
66 const bool scaled_pdf =
false )
71 ASSERTDEB_(
size_t(cov_inv.getColCount())==
size_t(x.size()) &&
size_t(cov_inv.getColCount())==
size_t(mu.size()))
73 return scaled_pdf ? ret : ret * ::sqrt(cov_inv.det()) / ::pow(static_cast<T>(
M_2PI),
static_cast<T
>(
size(cov_inv,1) ));
83 template <
class VECTORLIKE1,
class VECTORLIKE2,
class MATRIXLIKE>
86 const VECTORLIKE1 & x,
87 const VECTORLIKE2 & mu,
88 const MATRIXLIKE &
cov,
89 const bool scaled_pdf =
false )
96 template <
typename VECTORLIKE,
typename MATRIXLIKE>
102 ASSERTDEB_(
size_t(cov.getColCount())==
size_t(d.size()))
105 static_cast<typename MATRIXLIKE::value_type>(
M_2PI),
106 static_cast<typename MATRIXLIKE::value_type>(cov.getColCount()))
107 * ::sqrt(cov.det()));
115 template <
typename VECTORLIKE1,
typename MATRIXLIKE1,
typename VECTORLIKE2,
typename MATRIXLIKE2>
117 const VECTORLIKE1 &mu0,
const MATRIXLIKE1 &cov0,
118 const VECTORLIKE2 &mu1,
const MATRIXLIKE2 &cov1)
121 ASSERT_(
size_t(mu0.size())==
size_t(mu1.size()) &&
size_t(mu0.size())==
size_t(
size(cov0,1)) &&
size_t(mu0.size())==
size_t(
size(cov1,1)) && cov0.isSquare() && cov1.isSquare() )
122 const size_t N = mu0.size();
123 MATRIXLIKE2 cov1_inv;
125 const VECTORLIKE1 mu_difs = mu0-mu1;
126 return 0.5*( log(cov1.det()/cov0.det()) + (cov1_inv*cov0).trace() +
multiply_HCHt_scalar(mu_difs,cov1_inv) - N );
178 const double a = degreesOfFreedom + noncentrality;
179 const double b = (a + noncentrality) /
square(a);
180 const double t = (std::pow((
double)arg / a, 1.0/3.0) - (1.0 - 2.0 / 9.0 * b)) / std::sqrt(2.0 / 9.0 * b);
193 inline double chi2CDF(
unsigned int degreesOfFreedom,
double arg)
206 lans = lans + std::log(arg / j);
207 dans = std::exp(lans);
211 dans = dans * arg / j;
220 ASSERTMSG_(noncentrality >= 0.0 && arg >= 0.0 && eps > 0.0,
"noncentralChi2P(): parameters must be positive.");
221 if (arg == 0.0 && degreesOfFreedom > 0)
222 return std::make_pair(0.0, 0.0);
225 double b1 = 0.5 * noncentrality,
228 lnrtpi2 = 0.22579135264473,
229 probability, density, lans, dans, pans,
sum, am, hold;
230 unsigned int maxit = 500,
232 if(degreesOfFreedom % 2)
235 lans = -0.5 * (arg + std::log(arg)) - lnrtpi2;
236 dans = std::exp(lans);
237 pans =
erf(std::sqrt(arg/2.0));
243 dans = std::exp(lans);
248 if(degreesOfFreedom == 0)
251 degreesOfFreedom = 2;
253 sum = 1.0 / ao - 1.0 - am;
255 probability = 1.0 + am * pans;
260 degreesOfFreedom = degreesOfFreedom - 1;
262 sum = 1.0 / ao - 1.0;
263 while(i < degreesOfFreedom)
265 degreesOfFreedom = degreesOfFreedom + 1;
270 for(++m; m<maxit; ++m)
275 density = density + am * dans;
277 probability = probability + hold;
278 if((pans * sum < eps2) && (hold < eps2))
283 return std::make_pair(0.5 * ao * density, std::min(1.0, std::max(0.0, ao * probability)));
295 inline double chi2PDF(
unsigned int degreesOfFreedom,
double arg,
double accuracy = 1e-7)
304 template <
typename CONTAINER>
306 const CONTAINER &data,
310 const double confidenceInterval = 0.1,
311 const size_t histogramNumBins = 1000 )
315 ASSERT_(confidenceInterval>0 && confidenceInterval<1)
317 out_mean =
mean(data);
328 Hc*=1.0/Hc.maximum();
334 out_lower_conf_interval = x_min + idx_low * binWidth;
335 out_upper_conf_interval = x_min + idx_high * binWidth;