51 lines
1.2 KiB
C++
51 lines
1.2 KiB
C++
|
|
||
|
#include "gtl_math_var.h"
|
||
|
#include "gtl_math.h"
|
||
|
|
||
|
namespace gtl {
|
||
|
namespace math {
|
||
|
|
||
|
var::var(gtl::analog_data *data)
|
||
|
: analog_value(data)
|
||
|
, _variance(0.)
|
||
|
{
|
||
|
_name = "var";
|
||
|
}
|
||
|
|
||
|
void var::before_copying_data(std::vector<qreal>::iterator begin, std::vector<qreal>::iterator end)
|
||
|
{
|
||
|
_variance -= variance(begin, end);
|
||
|
}
|
||
|
|
||
|
void var::after_copying_data(std::vector<qreal>::iterator begin, std::vector<qreal>::iterator end)
|
||
|
{
|
||
|
_variance += variance(begin, end);
|
||
|
}
|
||
|
|
||
|
void var::data_changed()
|
||
|
{
|
||
|
analog_value::data_changed();
|
||
|
if(_data.size() != 0)
|
||
|
_value = _variance;
|
||
|
|
||
|
emit value_changed();
|
||
|
}
|
||
|
|
||
|
qreal var::variance(std::vector<qreal>::iterator begin, 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;
|
||
|
}
|
||
|
|
||
|
} // namespace math
|
||
|
} // namespace gtl
|
||
|
|