test_sdk/math/gtl_math.cpp

79 lines
2.0 KiB
C++
Raw Permalink Normal View History

#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;
}