27#ifndef math_vectorUtils_hpp
28#define math_vectorUtils_hpp
60template <
typename vectorT>
66 typename vectorT::value_type scale = 0,
68 typename vectorT::value_type offset = 0
78 for(
int i = 0; i < vec.size(); ++i )
79 vec[i] = i * scale + offset;
97template <
typename memberT>
100 std::vector<size_t> indices( values.size() );
102 std::iota( begin( indices ), end( indices ),
static_cast<size_t>( 0 ) );
104 std::sort( begin( indices ), end( indices ), [&](
size_t a,
size_t b ) {
return values[a] < values[b]; } );
117template <
typename valueT>
124 for(
size_t i = 0; i < sz; ++i )
140template <
typename vectorT>
141typename vectorT::value_type
vectorSum(
const vectorT &vec )
143 typename vectorT::value_type sum = 0;
145 for(
size_t i = 0; i < vec.size(); ++i )
161template <
typename valueT>
168 for(
size_t i = 0; i < sz; ++i )
186template <
typename vectorT>
189 typename vectorT::value_type mean = 0;
191 for(
size_t i = 0; i < vec.size(); ++i )
208template <
typename vectorT>
213 typename vectorT::value_type mean = 0, wsum = 0;
215 for(
size_t i = 0; i < vec.size(); ++i )
217 mean += w[i] * vec[i];
235template <
typename vectorT>
238 typename vectorT::value_type med;
240 int n = 0.5 * vec.size();
242 std::nth_element( vec.begin(), vec.begin() + n, vec.end() );
247 if( vec.size() % 2 == 0 )
249 med = 0.5 * ( med + *std::max_element( vec.begin(), vec.begin() + n ) );
264template <
typename vectorT>
270 typename vectorT::value_type med;
272 bool localWork =
false;
279 work->resize( vec.size() );
281 for(
int i = 0; i < vec.size(); ++i )
283 ( *work )[i] = vec[i];
303template <
typename valueT>
312 for(
size_t i = 0; i < sz; ++i )
314 var += pow( vec[i] - mean, 2 );
329template <
typename vectorT>
330typename vectorT::value_type
332 const typename vectorT::value_type &mean
335 typename vectorT::value_type var;
338 for(
size_t i = 0; i < vec.size(); ++i )
340 var += ( vec[i] - mean ) * ( vec[i] - mean );
343 var /= ( vec.size() - 1 );
355template <
typename valueT>
374template <
typename vectorT>
377 typename vectorT::value_type mean;
393template <
typename vectorT,
typename sigmaT>
395 const vectorT *weights,
406 typename vectorT::value_type med, var, Vsig, dev;
408 bool doWeight =
false;
411 if( weights->size() == vec.size() )
417 Vsig = sigma * sigma;
429 wwork.resize( vec.size() );
430 for(
int i = 0; i < vec.size(); ++i )
433 wwork[i] = ( *weights )[i];
437 while( passes < maxPasses || maxPasses == 0 )
443 for(
size_t i = 0; i < work.size(); ++i )
445 dev = pow( work[i] - med, 2 ) / var;
448 work.erase( work.begin() + i );
451 wwork.erase( wwork.begin() + i );
479template <
typename vectorT>
480typename vectorT::value_type
482 typename vectorT::value_type sigma
493template <
typename vectorT>
494typename vectorT::value_type
496 const vectorT &weights,
497 typename vectorT::value_type sigma,
509template <
typename vectorT>
510typename vectorT::value_type
512 const vectorT &weights,
513 typename vectorT::value_type sigma
522template <
typename valueT,
typename constT>
528 for(
size_t n = 0; n < sz; ++n )
533template <
typename vecT,
typename constT>
542template <
typename valueT>
552template <
typename vecT>
559template <
typename vecT>
567template <
typename realT>
577 for(
int i = 0; i < vecSize; ++i )
579 int j = i - 0.5 * win;
587 while( j <= i + 0.5 * win && j < vecSize )
603template <
typename realT>
605 std::vector<realT> &vec,
610 smVec.resize( vec.size() );
622template <
typename realT>
624 std::vector<realT> &vec,
625 std::vector<int> &wins,
634 for(
int i = 0; i < vec.size(); ++i )
636 int j = i - 0.5 * wins[i];
644 while( j <= i + 0.5 * wins[i] && j < vec.size() )
656 realT sumin = 0, sumout = 0;
658 for(
int i = 0; i < vec.size(); ++i )
664 for(
int i = 0; i < vec.size(); ++i )
666 smVec[i] *= sumin / sumout;
680template <
typename realT>
682 std::vector<realT> &vec,
693 const int before = win / 2;
694 const int after = win - before - 1;
695 std::vector<realT> tvec;
696 tvec.reserve( std::min<size_t>(
static_cast<size_t>( win ), vec.size() ) );
698 for(
int i = 0; i < vec.size(); ++i )
700 const int first = std::max( 0, i - before );
701 const int last = std::min<int>( vec.size(), i + after + 1 );
704 for(
int j = first; j < last; ++j )
706 tvec.push_back( vec[j] );
716template <
typename realT>
718 std::vector<realT> &vec,
724 for(
int i = 0; i < vec.size(); ++i )
726 int j = i - 0.5 * win;
734 while( j <= i + 0.5 * win && j < vec.size() )
736 if( vec[j] > smVec[i] )
754template <
typename vectorT>
767 binv.resize( v.size() / n );
769 for(
size_t i = 0; i < binv.size(); ++i )
774 for( j = 0; j < n; ++j )
776 if( i * n + j >= v.size() )
781 binv[i] += v[i * n + j];
803template <
typename vectorT,
typename binVectorT>
812 means.resize( binSzs.size() );
814 for(
size_t i = 0; i < binSzs.size(); ++i )
818 means[i].resize( means[i].size() + binv.size() );
819 for(
size_t j = 0; j < binv.size(); ++j )
821 means[i][means[i].size() - binv.size() + j] = binv[j];
835template <
typename realT,
typename fwhmT,
typename winhwT>
837 const std::vector<realT> &dataIn,
838 const std::vector<realT> &scale,
845 if( dataIn.size() != scale.size() )
853 dataOut.resize( dataIn.size() );
857 for(
int i = 0; i < dataIn.size(); ++i )
862 for(
int j = i - _winhw; j < i + _winhw; ++j )
868 if( j > dataIn.size() - 1 )
875 sum += G * dataIn[j];
879 dataOut[i] = sum / norm;
892template <
typename floatT>
894 std::vector<floatT> &sum,
895 std::vector<floatT> &vec
900 std::sort( svec.begin(), svec.end() );
902 sum.resize( svec.size() );
906 for(
int i = 1; i < svec.size(); ++i )
908 sum[i] = sum[i - 1] + svec[i];
921template <
typename floatT>
923 std::vector<floatT> &svec,
924 std::vector<floatT> &sum,
925 std::vector<floatT> &vec
930 std::sort( svec.begin(), svec.end(), std::greater<floatT>() );
932 sum.resize( svec.size() );
936 for(
int i = 1; i < svec.size(); ++i )
938 sum[i] = sum[i - 1] + svec[i];
Declarations for utilities related to the Gaussian function.
floatT fwhm2sigma(floatT fw)
Convert from FWHM to the Gaussian width parameter.
realT gaussian(const realT x, const realT G0, const realT G, const realT x0, const realT sigma)
Find value at position (x) of the 1D arbitrarily-centered symmetric Gaussian.
std::vector< size_t > vectorSortOrder(std::vector< memberT > const &values)
Return the indices of the vector in sorted order, without altering the vector itself.
void vectorMeanSub(valueT *vec, size_t sz)
Subtract the mean from a vector.
void vectorScale(vectorT &vec, size_t N=0, typename vectorT::value_type scale=0, typename vectorT::value_type offset=0)
Fill in a vector with a regularly spaced scale.
int vectorRebin(vectorT &binv, const vectorT &v, unsigned n, bool binMean=false)
Re-bin a vector by summing (or averaging) in bins of size n points.
vectorT::value_type vectorMedianInPlace(vectorT &vec)
Calculate median of a vector in-place, altering the vector.
vectorT::value_type vectorSigmaMean(const vectorT &vec, const vectorT *weights, const sigmaT &sigma, int &maxPasses)
Calculate the sigma-clipped mean of a vector.
int vectorBinMeans(std::vector< vectorT > &means, binVectorT &binSzs, const vectorT &v)
Calculate and accumulate the means of a timeseries in bins of various sizes.
int vectorGaussConvolve(std::vector< realT > &dataOut, const std::vector< realT > &dataIn, const std::vector< realT > &scale, const fwhmT fwhm, const winhwT winhw)
Convolve (smooth) a vector with a Gaussian.
valueT vectorMean(const valueT *vec, size_t sz)
Calculate the mean of a vector.
void vectorSub(valueT *vec, size_t sz, const constT &c)
Subtract a constant value from a vector.
valueT vectorVariance(const valueT *vec, size_t sz, valueT mean)
Calculate the variance of a vector relative to a supplied mean value.
int vectorCumHistReverse(std::vector< floatT > &svec, std::vector< floatT > &sum, std::vector< floatT > &vec)
Calculate a reverse cumulative histogram of a vector.
void vectorMedianSub(vecT &vec)
Subtract the median from a vector.
vectorT::value_type vectorMedian(const vectorT &vec, vectorT *work=0)
Calculate median of a vector, leaving the vector unaltered.
int vectorCumHist(std::vector< floatT > &svec, std::vector< floatT > &sum, std::vector< floatT > &vec)
Calculate a cumulative histogram of a vector.
int vectorSmoothMean(realT *smVec, realT *vec, size_t vecSize, int win)
Smooth a vector using the mean in a window specified by its full-width.
int vectorSmoothMedian(std::vector< realT > &smVec, std::vector< realT > &vec, int win)
Smooth a vector using the median in a window specified by its full width.
int vectorSmoothMax(std::vector< realT > &smVec, std::vector< realT > &vec, int win)
Smooth a vector using the max in a window specified by its full-width.
valueT vectorSum(const valueT *vec, size_t sz)
Calculate the sum of a vector.