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

basicmath: more functions

parent 5c162160
Branches
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 ...@@ -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)); (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 accumRe = 0;
fvalue accumIm = 0; fvalue accumIm = 0;
...@@ -47,7 +47,12 @@ std::complex<fvalue> mean(const std::vector<eis::DataPoint>& data) ...@@ -47,7 +47,12 @@ std::complex<fvalue> mean(const std::vector<eis::DataPoint>& data)
return std::complex<fvalue>(accumRe, accumIm); 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()) if(data.empty())
return std::complex<fvalue>(0,0); return std::complex<fvalue>(0,0);
...@@ -65,20 +70,33 @@ std::complex<fvalue> median(const std::vector<eis::DataPoint>& data) ...@@ -65,20 +70,33 @@ std::complex<fvalue> median(const std::vector<eis::DataPoint>& data)
realParts.push_back(point.im.real()); realParts.push_back(point.im.real());
} }
std::sort(imagParts.begin(), imagParts.end()); fvalue realMean = medianTrampoline(realParts);
std::sort(realParts.begin(), realParts.end()); 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 accum = 0;
fvalue imag = (imagParts[data.size()/2] + imagParts[data.size()/2-1])/2;
return std::complex<fvalue>(real, imag); for(fvalue point : data)
accum += point;
return accum/data.size();
} }
else
fvalue eis::median(std::vector<fvalue> data)
{ {
size_t index = data.size()/2; if(data.empty())
return std::complex<fvalue>(realParts[index], imagParts[index]); 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 ...@@ -7,6 +7,8 @@ namespace eis
{ {
std::complex<fvalue> absGrad(const std::vector<eis::DataPoint>& data, size_t index); 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); 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); 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); 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