- added statistics folder
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/cpp@1042 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef _STATISTICS_SLIDINGMINMAX_HPP_
|
||||||
|
#define _STATISTICS_SLIDINGMINMAX_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cpp/radio/Vector.hpp>
|
||||||
|
#include <cpp/radio/statistics/SlidingMinMax.hpp>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <blaze/Blaze.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Radio
|
||||||
|
{
|
||||||
|
namespace Statistics
|
||||||
|
{
|
||||||
|
|
||||||
|
// Sliding Min/Max based on MAXLIST-Algorithm, based on:
|
||||||
|
// "AN EFFICIENT ALGORITHM FOR RUNNING MAX MIN CALCULATION", 1996, S.C. Douglas, University of Utah
|
||||||
|
// Dependeding on 'mode' this algorithm calculates either minimum (mode = -1) or maximum (mode = +1)
|
||||||
|
template <typename T>
|
||||||
|
class SlidingMinMax
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Mode
|
||||||
|
{
|
||||||
|
Min,
|
||||||
|
Max
|
||||||
|
};
|
||||||
|
|
||||||
|
SlidingMinMax(Mode mode, size_t L, T P);
|
||||||
|
~SlidingMinMax();
|
||||||
|
void process(T const &xin);
|
||||||
|
T getWinner()
|
||||||
|
{
|
||||||
|
return m_win_value;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
size_t m_L;
|
||||||
|
T m_P;
|
||||||
|
size_t m_N;
|
||||||
|
Mode m_mode;
|
||||||
|
RealScalar m_mode_value;
|
||||||
|
T m_win_value;
|
||||||
|
size_t m_win_index;
|
||||||
|
|
||||||
|
blaze::DynamicVector<T> m_pU;
|
||||||
|
blaze::DynamicVector<T> m_pU_last;
|
||||||
|
blaze::DynamicVector<size_t> m_pP;
|
||||||
|
blaze::DynamicVector<size_t> m_pP_last;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "SlidingMinMax.tcc"
|
||||||
|
|
||||||
|
} // Statistics
|
||||||
|
} // Radio
|
||||||
|
|
||||||
|
#endif // _STATISTICS_SLIDINGMINMAX_HPP_
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
#include "SlidingMinMax.hpp"
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
SlidingMinMax<T>::SlidingMinMax(Mode mode, size_t L, T P)
|
||||||
|
: m_mode(mode)
|
||||||
|
, m_L(L)
|
||||||
|
, m_P(P)
|
||||||
|
, m_N(0)
|
||||||
|
, m_win_value(0)
|
||||||
|
, m_win_index(0)
|
||||||
|
{
|
||||||
|
m_pP.resize(L);
|
||||||
|
m_pP_last.resize(L);
|
||||||
|
m_pU.resize(L);
|
||||||
|
m_pU_last.resize(L);
|
||||||
|
|
||||||
|
m_pP = 0;
|
||||||
|
m_pP_last = 0;
|
||||||
|
m_pU = T(0);
|
||||||
|
m_pU_last = T(0);
|
||||||
|
m_pU_last[1] = P;
|
||||||
|
|
||||||
|
m_mode_value = 1.0;
|
||||||
|
if (mode == Mode::Min)
|
||||||
|
{
|
||||||
|
m_mode_value = -1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
SlidingMinMax<T>::~SlidingMinMax()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void SlidingMinMax<T>::process(T const &xin)
|
||||||
|
{
|
||||||
|
T x = xin*m_mode_value;
|
||||||
|
|
||||||
|
size_t m = 1;
|
||||||
|
if (m_pP_last[m_N] == m_L)
|
||||||
|
{
|
||||||
|
m = 0;
|
||||||
|
m_pU_last[m_N] = m_P;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
while (x >= m_pU_last[i+1])
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
m_N = m_N - i + m;
|
||||||
|
|
||||||
|
for (size_t j=1; j < m_N; j++)
|
||||||
|
{
|
||||||
|
m_pU[j+1] = m_pU_last[j+i];
|
||||||
|
m_pP[j+1] = m_pP_last[j+i] + 1;
|
||||||
|
}
|
||||||
|
m_pU[m_N+1] = m_P;
|
||||||
|
m_pU[1] = x;
|
||||||
|
m_pP[1] = 1;
|
||||||
|
|
||||||
|
i=0;
|
||||||
|
while(m_pU[i] != m_P)
|
||||||
|
{
|
||||||
|
m_pU_last[i] = m_pU[i];
|
||||||
|
m_pP_last[i] = m_pP[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
m_pU_last[i] = m_pU[i];
|
||||||
|
m_pP_last[i] = m_pP[i];
|
||||||
|
|
||||||
|
m_win_value = m_pU[m_N];
|
||||||
|
m_win_index = m_pP[m_N];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user