RunningStatVector.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. #ifdef NOVISUAL
  8. #include <vislearning/nice_nonvis.h>
  9. #else
  10. #include <vislearning/nice.h>
  11. #endif
  12. #include "vislearning/baselib/RunningStatVector.h"
  13. using namespace OBJREC;
  14. using namespace std;
  15. using namespace NICE;
  16. void RunningStatVector::Clear()
  17. {
  18. m_n = 0;
  19. for (size_t k = 0; k < datavector.size(); k++)
  20. {
  21. if (datavector[k] != NULL)
  22. {
  23. delete datavector[k];
  24. }
  25. }
  26. datavector.clear();
  27. }
  28. RunningStatVector::~RunningStatVector()
  29. {
  30. Clear();
  31. }
  32. void RunningStatVector::Push(NICE::Vector x)
  33. {
  34. m_n++;
  35. // See Knuth TAOCP vol 2, 3rd edition, page 232
  36. if ((size_t) x.size() != this->size)
  37. {
  38. if (m_n == 1)
  39. {
  40. this->size = x.size();
  41. }
  42. else
  43. {
  44. fthrow(Exception,"RunningStatVector::Push(): this->size != x.size()\n");
  45. }
  46. }
  47. else
  48. {
  49. for (size_t k = 0; k < x.size(); k++)
  50. {
  51. if (m_n == 1)
  52. {
  53. RunningStat * rs = new RunningStat();
  54. datavector.push_back(rs);
  55. }
  56. datavector[k]->Push(x[k]);
  57. }
  58. }
  59. }
  60. size_t RunningStatVector::NumDataValues() const
  61. {
  62. return m_n;
  63. }
  64. size_t RunningStatVector::Size() const
  65. {
  66. return size;
  67. }
  68. NICE::Vector RunningStatVector::Mean() const
  69. {
  70. NICE::Vector mean(datavector.size(), 0.0);
  71. for (size_t k = 0; k < datavector.size(); k++)
  72. {
  73. mean[k] = datavector[k]->Mean();
  74. }
  75. return mean;
  76. }
  77. NICE::Vector RunningStatVector::Variance() const
  78. {
  79. NICE::Vector variance(datavector.size(), 0.0);
  80. for (size_t k = 0; k < datavector.size(); k++)
  81. {
  82. variance[k] = datavector[k]->Variance();
  83. }
  84. return variance;
  85. }
  86. NICE::Vector RunningStatVector::StandardDeviation() const
  87. {
  88. NICE::Vector std(Variance());
  89. for (size_t k = 0; k < std.size(); k++)
  90. {
  91. std[k] = sqrt(std[k]);
  92. }
  93. return std;
  94. }