gmm_misc_meat.hpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
  2. // Copyright 2008-2016 National ICT Australia (NICTA)
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // ------------------------------------------------------------------------
  15. //! \addtogroup gmm_misc
  16. //! @{
  17. namespace gmm_priv
  18. {
  19. template<typename eT>
  20. inline
  21. running_mean_scalar<eT>::running_mean_scalar()
  22. : counter(uword(0))
  23. , r_mean ( eT(0))
  24. {
  25. arma_extra_debug_sigprint_this(this);
  26. }
  27. template<typename eT>
  28. inline
  29. running_mean_scalar<eT>::running_mean_scalar(const running_mean_scalar<eT>& in)
  30. : counter(in.counter)
  31. , r_mean (in.r_mean )
  32. {
  33. arma_extra_debug_sigprint_this(this);
  34. }
  35. template<typename eT>
  36. inline
  37. const running_mean_scalar<eT>&
  38. running_mean_scalar<eT>::operator=(const running_mean_scalar<eT>& in)
  39. {
  40. arma_extra_debug_sigprint();
  41. counter = in.counter;
  42. r_mean = in.r_mean;
  43. return *this;
  44. }
  45. template<typename eT>
  46. arma_hot
  47. inline
  48. void
  49. running_mean_scalar<eT>::operator() (const eT X)
  50. {
  51. arma_extra_debug_sigprint();
  52. counter++;
  53. if(counter > 1)
  54. {
  55. const eT old_r_mean = r_mean;
  56. r_mean = old_r_mean + (X - old_r_mean)/counter;
  57. }
  58. else
  59. {
  60. r_mean = X;
  61. }
  62. }
  63. template<typename eT>
  64. inline
  65. void
  66. running_mean_scalar<eT>::reset()
  67. {
  68. arma_extra_debug_sigprint();
  69. counter = 0;
  70. r_mean = eT(0);
  71. }
  72. template<typename eT>
  73. inline
  74. uword
  75. running_mean_scalar<eT>::count() const
  76. {
  77. return counter;
  78. }
  79. template<typename eT>
  80. inline
  81. eT
  82. running_mean_scalar<eT>::mean() const
  83. {
  84. return r_mean;
  85. }
  86. //
  87. //
  88. //
  89. template<typename eT>
  90. arma_inline
  91. arma_hot
  92. eT
  93. distance<eT, uword(1)>::eval(const uword N, const eT* A, const eT* B, const eT*)
  94. {
  95. eT acc1 = eT(0);
  96. eT acc2 = eT(0);
  97. uword i,j;
  98. for(i=0, j=1; j<N; i+=2, j+=2)
  99. {
  100. eT tmp_i = A[i];
  101. eT tmp_j = A[j];
  102. tmp_i -= B[i];
  103. tmp_j -= B[j];
  104. acc1 += tmp_i*tmp_i;
  105. acc2 += tmp_j*tmp_j;
  106. }
  107. if(i < N)
  108. {
  109. const eT tmp_i = A[i] - B[i];
  110. acc1 += tmp_i*tmp_i;
  111. }
  112. return (acc1 + acc2);
  113. }
  114. template<typename eT>
  115. arma_inline
  116. arma_hot
  117. eT
  118. distance<eT, uword(2)>::eval(const uword N, const eT* A, const eT* B, const eT* C)
  119. {
  120. eT acc1 = eT(0);
  121. eT acc2 = eT(0);
  122. uword i,j;
  123. for(i=0, j=1; j<N; i+=2, j+=2)
  124. {
  125. eT tmp_i = A[i];
  126. eT tmp_j = A[j];
  127. tmp_i -= B[i];
  128. tmp_j -= B[j];
  129. acc1 += (tmp_i*tmp_i) * C[i];
  130. acc2 += (tmp_j*tmp_j) * C[j];
  131. }
  132. if(i < N)
  133. {
  134. const eT tmp_i = A[i] - B[i];
  135. acc1 += (tmp_i*tmp_i) * C[i];
  136. }
  137. return (acc1 + acc2);
  138. }
  139. }
  140. //! @}