RunningStatVector.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /**
  2. * @file RunningStatVector.cpp
  3. * @brief B. P. Welford Computation of Mean and Variance download at: http://www.johndcook.com/standard_deviation.html
  4. * @author Michael Koch
  5. * @date 19/01/2010
  6. */
  7. #include "core/image/ImageT.h"
  8. #include "core/vector/VectorT.h"
  9. #include "core/vector/MatrixT.h"
  10. #include "vislearning/baselib/RunningStatVector.h"
  11. using namespace OBJREC;
  12. using namespace std;
  13. using namespace NICE;
  14. void RunningStatVector::Clear()
  15. {
  16. m_n = 0;
  17. for (size_t k = 0; k < datavector.size(); k++)
  18. {
  19. if (datavector[k] != NULL)
  20. {
  21. delete datavector[k];
  22. }
  23. }
  24. datavector.clear();
  25. }
  26. RunningStatVector::~RunningStatVector()
  27. {
  28. Clear();
  29. }
  30. void RunningStatVector::Push(NICE::Vector x)
  31. {
  32. m_n++;
  33. // See Knuth TAOCP vol 2, 3rd edition, page 232
  34. if ((size_t) x.size() != this->size)
  35. {
  36. if (m_n == 1)
  37. {
  38. this->size = x.size();
  39. }
  40. else
  41. {
  42. fthrow(Exception,"RunningStatVector::Push(): this->size != x.size()\n");
  43. }
  44. }
  45. else
  46. {
  47. for (size_t k = 0; k < x.size(); k++)
  48. {
  49. if (m_n == 1)
  50. {
  51. RunningStat * rs = new RunningStat();
  52. datavector.push_back(rs);
  53. }
  54. datavector[k]->Push(x[k]);
  55. }
  56. }
  57. }
  58. size_t RunningStatVector::NumDataValues() const
  59. {
  60. return m_n;
  61. }
  62. size_t RunningStatVector::Size() const
  63. {
  64. return size;
  65. }
  66. NICE::Vector RunningStatVector::Mean() const
  67. {
  68. NICE::Vector mean(datavector.size(), 0.0);
  69. for (size_t k = 0; k < datavector.size(); k++)
  70. {
  71. mean[k] = datavector[k]->Mean();
  72. }
  73. return mean;
  74. }
  75. NICE::Vector RunningStatVector::Variance() const
  76. {
  77. NICE::Vector variance(datavector.size(), 0.0);
  78. for (size_t k = 0; k < datavector.size(); k++)
  79. {
  80. variance[k] = datavector[k]->Variance();
  81. }
  82. return variance;
  83. }
  84. NICE::Vector RunningStatVector::StandardDeviation() const
  85. {
  86. NICE::Vector std(Variance());
  87. for (size_t k = 0; k < std.size(); k++)
  88. {
  89. std[k] = sqrt(std[k]);
  90. }
  91. return std;
  92. }