79 lines
2.0 KiB
C++
79 lines
2.0 KiB
C++
|
#include "gtl_math.h"
|
||
|
#include <vector>
|
||
|
#include <QtMath>
|
||
|
#include <numeric>
|
||
|
|
||
|
mathFunctions::mathFunctions()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
qreal mathFunctions::squared_sum(const std::vector<qreal>::iterator &begin, const std::vector<qreal>::iterator &end)
|
||
|
{
|
||
|
qreal sum = 0;
|
||
|
for(auto it = begin; it != end; ++it) {
|
||
|
sum += qPow(*it, 2);
|
||
|
}
|
||
|
return sum;
|
||
|
}
|
||
|
|
||
|
qreal mathFunctions::rms(const std::vector<qreal>::iterator &begin, const std::vector<qreal>::iterator &end)
|
||
|
{
|
||
|
return qSqrt(mathFunctions::squared_sum(begin, end)/std::distance(begin,end));
|
||
|
}
|
||
|
|
||
|
qreal mathFunctions::max(const std::vector<qreal>::iterator &begin, const std::vector<qreal>::iterator &end)
|
||
|
{
|
||
|
return *std::max_element(begin, end);
|
||
|
}
|
||
|
|
||
|
qreal mathFunctions::min(const std::vector<qreal>::iterator &begin, const std::vector<qreal>::iterator &end)
|
||
|
{
|
||
|
return *std::min_element(begin, end);
|
||
|
}
|
||
|
|
||
|
qreal mathFunctions::mean(const std::vector<qreal>::iterator &begin, const std::vector<qreal>::iterator &end)
|
||
|
{
|
||
|
return std::accumulate(begin, end, 0.)/std::distance(begin, end);
|
||
|
}
|
||
|
|
||
|
qreal mathFunctions::kurt(const std::vector<qreal>::iterator &begin, const std::vector<qreal>::iterator &end)
|
||
|
{
|
||
|
qreal value = 0;
|
||
|
int n = std::distance(begin, end);
|
||
|
if(n > 3)
|
||
|
{
|
||
|
qreal mean = mathFunctions::mean(begin, end);
|
||
|
qreal variance = 0.;
|
||
|
for(auto it = begin; it != end; ++it)
|
||
|
variance += pow((*it - mean), 2);
|
||
|
variance /= n;
|
||
|
|
||
|
qreal sigma = 0;
|
||
|
for(auto it = begin; it != end; ++it)
|
||
|
sigma += pow((*it - mean), 4);
|
||
|
|
||
|
sigma /= n;
|
||
|
|
||
|
qreal k1 = (qreal)(n*n - 1) / (qreal)((n-2)*(n-3));
|
||
|
qreal k2 = (qreal)((6. / (n + 1.)) - 3.);
|
||
|
|
||
|
value = k1*(sigma/pow(variance,2) + k2);
|
||
|
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
qreal mathFunctions::var(const std::vector<qreal>::iterator &begin, const std::vector<qreal>::iterator &end)
|
||
|
{
|
||
|
int n = std::distance(begin, end);
|
||
|
|
||
|
qreal mean = std::accumulate(begin, end, 0.)/n;
|
||
|
|
||
|
qreal v = 0.;
|
||
|
for(auto it = begin; it != end; ++it)
|
||
|
v += qPow((*it - mean), 2);
|
||
|
v /= n-1;
|
||
|
|
||
|
return v;
|
||
|
}
|