Skip to content
Snippets Groups Projects
Select Git revision
  • 492eab0a00f40cbef2dc54b976ab0c8824ccd3ef
  • main default protected
  • master
3 results

MagicWandMap.umap

Blame
  • basicmath.cpp 2.40 KiB
    #include "basicmath.h"
    #include <algorithm>
    
    #include "eistype.h"
    
    std::complex<fvalue> eis::absGrad(const std::vector<eis::DataPoint>& data, size_t index)
    {
    	if(data.size() < 3)
    		return std::complex<fvalue>(1,1);
    
    	if(index == 0)
    		index = 1;
    	else if(index > data.size()-2)
    		index = data.size()-2;
    
    	return std::complex<fvalue>(std::abs((data[index+1].im.real()-data[index-1].im.real())/(data[index+1].omega-data[index-1].omega)),
    								std::abs((data[index+1].im.imag()-data[index-1].im.imag())/(data[index+1].omega-data[index-1].omega)));
    }
    
    std::complex<fvalue> eis::grad(const std::vector<eis::DataPoint>& data, size_t index)
    {
    	if(data.size() < 3)
    		return std::complex<fvalue>(1,1);
    
    	if(index == 0)
    		index = 1;
    	else if(index > data.size()-2)
    		index = data.size()-2;
    
    	return std::complex<fvalue>((data[index+1].im.real()-data[index-1].im.real())/(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> eis::mean(const std::vector<eis::DataPoint>& data)
    {
    	fvalue accumRe = 0;
    	fvalue accumIm = 0;
    
    	for(const eis::DataPoint& point : data)
    	{
    		accumRe += point.im.real();
    		accumIm += point.im.imag();
    	}
    
    	accumRe /= data.size();
    	accumIm /= data.size();
    	return std::complex<fvalue>(accumRe, accumIm);
    }
    
    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);
    	else if(data.size() == 1)
    		return data[0].im;
    
    	std::vector<fvalue> imagParts;
    	imagParts.reserve(data.size());
    	std::vector<fvalue> realParts;
    	realParts.reserve(data.size());
    
    	for(const eis::DataPoint& point : data)
    	{
    		imagParts.push_back(point.im.imag());
    		realParts.push_back(point.im.real());