19 #include "itkNumericTraits.h"
20 #include "vnl/vnl_math.h"
21 #include "vnl/vnl_erf.h"
24 namespace Statistics {
30 m_Parameters[0] = 0.0;
31 m_Parameters[1] = 1.0;
39 if (m_Parameters.GetSize() == 2)
41 return m_Parameters[0];
46 ::itk::OStringStream message;
47 message <<
"itk::ERROR: " << this->GetNameOfClass()
48 <<
"(" <<
this <<
"): "
49 <<
"Invalid number of parameters to describe distribution.";
63 if (m_Parameters.GetSize() > 0)
65 if (m_Parameters[0] != mean)
71 if (m_Parameters.GetSize() != 2)
77 if (m_Parameters.GetSize() > 1)
93 m_Parameters[1] = 1.0;
99 m_Parameters[0] = mean;
111 if (m_Parameters.GetSize() == 2)
113 return m_Parameters[1];
118 ::itk::OStringStream message;
119 message <<
"itk::ERROR: " << this->GetNameOfClass()
120 <<
"(" <<
this <<
"): "
121 <<
"Invalid number of parameters to describe distribution.";
133 bool modified =
false;
135 if (m_Parameters.GetSize() > 1)
137 if (m_Parameters[1] != variance)
143 if (m_Parameters.GetSize() != 2)
149 if (m_Parameters.GetSize() > 0)
165 m_Parameters[0] = 0.0;
171 m_Parameters[1] = variance;
189 ::PDF(
double x,
double mean,
double variance)
191 double xminusmean = x - mean;
194 * vcl_exp(-0.5*xminusmean*xminusmean / variance);
204 return PDF(x, p[0], p[1]);
209 ::itk::OStringStream message;
210 message <<
"itk::ERROR: "
211 <<
"GaussianDistribution: "
212 <<
"Invalid number of parameters to describe distribution.";
230 ::CDF(
double x,
double mean,
double variance)
233 double u = (x - mean) / vcl_sqrt(variance);
251 ::itk::OStringStream message;
252 message <<
"itk::ERROR: "
253 <<
"GaussianDistribution: "
254 <<
"Invalid number of parameters to describe distribution.";
266 double dp , dx , dt , ddq , dq;
269 dp = (p <= 0.5) ? (p) : (1.0-p);
281 return itk::NumericTraits<double>::NonpositiveMin();
285 return itk::NumericTraits<double>::max();
291 dt = vcl_sqrt( -2.0 * vcl_log(dp) );
293 - ((.010328e+0*dt + .802853e+0)*dt + 2.515517e+0)
294 /(((.001308e+0*dt + .189269e+0)*dt + 1.432788e+0)*dt + 1.e+0);
298 for( newt=0; newt < 3; newt++ )
301 ddq = vcl_exp( -0.5e+0 * dx * dx ) / 2.506628274631000e+0;
311 dx = ( (p <= 0.5) ? (-dx) : (dx) );
325 x = x*vcl_sqrt(variance) + mean;
342 ::itk::OStringStream message;
343 message <<
"itk::ERROR: "
344 <<
"GaussianDistribution: "
345 <<
"Invalid number of parameters to describe distribution.";
357 if (m_Parameters.GetSize() == 2)
359 if (m_Parameters[0] == 0.0 && m_Parameters[1] == 1.0)
369 ::itk::OStringStream message;
370 message <<
"itk::ERROR: " << this->GetNameOfClass()
371 <<
"(" <<
this <<
"): "
372 <<
"Invalid number of parameters to describe distribution.";
386 if (p[0] == 0.0 && p[1] == 1.0)
396 ::itk::OStringStream message;
397 message <<
"itk::ERROR: " << this->GetNameOfClass()
398 <<
"(" <<
this <<
"): "
399 <<
"Invalid number of parameters to describe distribution.";
411 if (mean == 0.0 && variance == 1.0)
424 if (m_Parameters.GetSize() == 2)
426 if (m_Parameters[0] == 0.0 && m_Parameters[1] == 1.0)
436 ::itk::OStringStream message;
437 message <<
"itk::ERROR: " << this->GetNameOfClass()
438 <<
"(" <<
this <<
"): "
439 <<
"Invalid number of parameters to describe distribution.";
453 if (p[0] == 0.0 && p[1] == 1.0)
463 ::itk::OStringStream message;
464 message <<
"itk::ERROR: " << this->GetNameOfClass()
465 <<
"(" <<
this <<
"): "
466 <<
"Invalid number of parameters to describe distribution.";
478 if (mean == 0.0 && variance == 1.0)
491 if (m_Parameters.GetSize() == 2)
493 if (m_Parameters[0] == 0.0 && m_Parameters[1] == 1.0)
503 ::itk::OStringStream message;
504 message <<
"itk::ERROR: " << this->GetNameOfClass()
505 <<
"(" <<
this <<
"): "
506 <<
"Invalid number of parameters to describe distribution.";
520 if (params[0] == 0.0 && params[1] == 1.0)
530 ::itk::OStringStream message;
531 message <<
"itk::ERROR: " << this->GetNameOfClass()
532 <<
"(" <<
this <<
"): "
533 <<
"Invalid number of parameters to describe distribution.";
545 if (mean == 0.0 && variance == 1.0)
557 Superclass::PrintSelf(os,indent);
559 if (m_Parameters.GetSize() > 0)
561 os << indent <<
"Mean: " << m_Parameters[0] << std::endl;
565 os << indent <<
"Mean: (unknown)" << std::endl;
568 if (m_Parameters.GetSize() > 1)
570 os << indent <<
"Variance: " << m_Parameters[1] << std::endl;
574 os << indent <<
"Variance: (unknown)" << std::endl;