Skip to content
Snippets Groups Projects
Commit a4c03dae authored by Carl Klemm's avatar Carl Klemm
Browse files

basicmath: more functions

parent 5c162160
No related branches found
No related tags found
No related merge requests found
......@@ -31,7 +31,7 @@ std::complex<fvalue> eis::grad(const std::vector<eis::DataPoint>& data, size_t i
(data[index+1].im.imag()-data[index-1].im.imag())/(data[index+1].omega-data[index-1].omega));
}
std::complex<fvalue> mean(const std::vector<eis::DataPoint>& data)
std::complex<fvalue> eis::mean(const std::vector<eis::DataPoint>& data)
{
fvalue accumRe = 0;
fvalue accumIm = 0;
......@@ -47,7 +47,12 @@ std::complex<fvalue> mean(const std::vector<eis::DataPoint>& data)
return std::complex<fvalue>(accumRe, accumIm);
}
std::complex<fvalue> median(const std::vector<eis::DataPoint>& data)
static inline fvalue medianTrampoline(const std::vector<fvalue> data)
{
return eis::median(data);
}
std::complex<fvalue> eis::median(const std::vector<eis::DataPoint>& data)
{
if(data.empty())
return std::complex<fvalue>(0,0);
......@@ -65,20 +70,33 @@ std::complex<fvalue> median(const std::vector<eis::DataPoint>& data)
realParts.push_back(point.im.real());
}
std::sort(imagParts.begin(), imagParts.end());
std::sort(realParts.begin(), realParts.end());
fvalue realMean = medianTrampoline(realParts);
fvalue imagMean = medianTrampoline(imagParts);
return std::complex<fvalue>(realMean, imagMean);
}
if(data.size() % 2 == 0)
fvalue eis::mean(const std::vector<fvalue>& data)
{
fvalue real = (realParts[data.size()/2] + realParts[data.size()/2-1])/2;
fvalue imag = (imagParts[data.size()/2] + imagParts[data.size()/2-1])/2;
return std::complex<fvalue>(real, imag);
fvalue accum = 0;
for(fvalue point : data)
accum += point;
return accum/data.size();
}
else
fvalue eis::median(std::vector<fvalue> data)
{
size_t index = data.size()/2;
return std::complex<fvalue>(realParts[index], imagParts[index]);
}
if(data.empty())
return 0;
else if(data.size() == 1)
return data[0];
std::sort(data.begin(), data.end());
if(data.size() % 2 == 0)
return (data[data.size()/2] + data[data.size()/2-1])/2;
else
return data[data.size()/2];
}
......@@ -7,6 +7,8 @@ namespace eis
{
std::complex<fvalue> absGrad(const std::vector<eis::DataPoint>& data, size_t index);
std::complex<fvalue> grad(const std::vector<eis::DataPoint>& data, size_t index);
fvalue mean(const std::vector<fvalue>& data);
std::complex<fvalue> mean(const std::vector<eis::DataPoint>& data);
fvalue median(std::vector<fvalue> data);
std::complex<fvalue> median(const std::vector<eis::DataPoint>& data);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment