template< typename SAMPLE, int QUEUE_SIZE, int QUEUE_SIZE_ = QUEUE_SIZE + 1 >
class CQUE
{
private:
SAMPLE* samples;
size_t front;
size_t back;
public:
CQUE()
: front( 0 )
, back( 0 )
{
samples = new SAMPLE[ QUEUE_SIZE_ ];
}
~CQUE()
{
delete[] samples;
}
size_t size()
{
return ( back - front + QUEUE_SIZE_ ) % QUEUE_SIZE_;
}
void push_back( const SAMPLE sample )
{
samples[ back++ ] = sample;
back %= QUEUE_SIZE_;
}
SAMPLE pop_front()
{
SAMPLE sample = samples[ front++ ];
front %= QUEUE_SIZE_;
return sample;
}
};
//------------------------------------------------------------------------------
#include <math.h>
template< typename SAMPLE, int QUEUE_SIZE = 1024 >
class STREAM_ANALYZER
{
private:
CQUE< SAMPLE, QUEUE_SIZE > samples;
double sum_samples;
double sum_squares;
size_t size;
public:
STREAM_ANALYZER()
: sum_samples( 0. )
, sum_squares( 0. )
, size( 0 )
{}
~STREAM_ANALYZER()
{}
STREAM_ANALYZER& operator<<( const SAMPLE sample )
{
if( size == QUEUE_SIZE )
{
double old_sample = samples.pop_front();
sum_samples -= old_sample;
sum_squares -= old_sample * old_sample;
}
else size++;
sum_samples += sample;
sum_squares += sample * sample;
samples.push_back( sample );
return *this;
}
double average()
{
if( size == 0 ) return 0.;
return sum_samples / size;
}
double variance()
{
if( size <= 1 ) return 0.;
return ( sum_squares - sum_samples * sum_samples / size ) / ( size - 1 );
}
double stdev()
{
if( size <= 1 ) return 0.;
return sqrt( variance() );
}
};
//------------------------------------------------------------------------------
#include <stdlib.h>
#include <iostream>
STREAM_ANALYZER< float, 5 > oscilloscope; // 1024 개를 쓰고 싶으면 수정해라
int main()
{
for( int i = 0; i < 10; ++i )
{
float sample = (float)rand() / rand();
oscilloscope << sample;
std::cout
<< "input : " << sample
<< " --> avg " << oscilloscope.average()
<< " , stdev " << oscilloscope.stdev()
<< std::endl;
}
return 0;
}
치사하게 C++을 쓰네
인덴트 맘에든다 클래식 C++ 개발자 클라스가 이거다 자바충들아 ^^
CQUE 구조체 Copy 하면어케대나염
값이 들어올때마다 계산 안해도 구할 수 있는 방법있냐는 뻘질문인거 같던데 들어올 때마다 구하네
만들어 쓰면 되쥐~
값이 들어올때 마다 배열 전부 다를 계산하지 않는 방법이 있는가를 묻는거야 등신아.
걍 편하게 deque 쓰려다가 힙에 생성시켜서 직접 간단히 만든건 복사같은거 고려 안하고 있어유~
일단 속도 최적화만 구현한 것.
클라스 지린다
저런건 시리얼이나 이더넷 같은 스트림 데이타로 부터 이벤트 핸들러 형태로 추가하게 되니깐 복사할 일은 없쥐 thread safe 하게 고칠 순 있지만 것두 drawing 쪽은 대개 하나의 쓰레드에서 해야하고, 집어넣는 쓰레드도 대개 한 곳이라 그닥. 귀찮으니 기본형만 : ) asio 에서 lock 갖다쓰면 됨.