22 #ifndef SIMPLEPICKER_H 23 #define SIMPLEPICKER_H 28 #include <boost/lexical_cast.hpp> 48 template<
typename Tit,
typename Outit>
52 std::ptrdiff_t lag = 2
58 worker_.resize(std::distance(beg,end) - lag);
59 TReal * pworkerBeg = &worker_[0];
60 TReal * pworkerEnd = &worker_[0] + worker_.size();
63 Tit tbeginm1 = tbegin + ( lag);
64 for(;tbeginm1 != end ; ++tbeginm1, ++tbegin, ++pworkerBeg )
66 *pworkerBeg = (*tbeginm1 - *tbegin);
70 pworkerBeg = &worker_[0];
71 std::size_t crosscount = 0;
72 for(
int i = 0 ; (pworkerBeg != pworkerEnd-1) ; ++pworkerBeg , ++i )
74 if(crosscount >= nzercross){
77 std::string
x =
"nzerocross:";
89 throw std::length_error(x.c_str());
91 TReal v1 = (*pworkerBeg);
92 TReal v2 = *(pworkerBeg + 1);
94 if((v1 > 0 && v2 < 0) && ((v1 - v2) > epsilon_))
97 double frac = v1 / ( v1 - v2 );
98 double idx =
static_cast<float>(i + lag/2) + frac;
99 *zerocrossings = ( idx );
102 }
else if( v1 > 0 && v2 == 0 ){
103 TReal v3 = *(pworkerBeg + 2);
104 if((v3 < 0) && ((v1 - v3) > epsilon_)){
105 *zerocrossings = (i + lag/2 + 1.);
123 #endif // SIMPLEPICKER_H
std::vector< TReal > worker_
float lexical_cast(const std::string &str)
SimplePicker(TReal epsilon=1e-3)
size_t operator()(Tit beg, Tit end, Outit zerocrossings, size_t nzercross, std::ptrdiff_t lag=2)
EQUISPACEINTERPOL Interpolation on a equidistantly spaced grid.
KernelTraitsBase< Kernel >::space_type::abscissa_type x