/** \file optvec \brief A ready to use, but ad-hoc mathematical vector class \author Junhua Gu */ #ifndef OPTVEC_HPP #define OPTVEC_HPP #include #include #include namespace opt_utilities { template class optvec :public std::vector { public: optvec() {} explicit optvec(size_t s) :std::vector(s) {} optvec(const std::vector& rhs) :std::vector(rhs) {} optvec& operator=(const optvec& rhs) { static_cast&>(*this).operator=(rhs); //std::cerr<<"rhs.size="<& () { return dynamic_cast&>(*this); } operator const std::vector& ()const { return dynamic_cast&>(*this); } }; template optvec operator+(const optvec& x1,const optvec& x2) { optvec result(min(x1.size(),x2.size())); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]+x2[i]; } return result; } template optvec operator+(const optvec& x1,const T& x2) { optvec result(x1.size()); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]+x2; } return result; } template optvec& operator+=(optvec& x1,const optvec& x2) { for(size_t i=0;i!=min(x1.size(),x2.size());++i) { x1[i]+=x2[i]; } return x1; } template optvec operator-(const optvec& x1,const optvec& x2) { optvec result(min(x1.size(),x2.size())); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]-x2[i]; } return result; } template optvec operator-(const optvec& x1,const T& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]-x2; } return result; } template optvec operator-(const optvec& x1) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=-x1[i]; } return result; } template optvec& operator-=(optvec& x1,const optvec& x2) { for(size_t i=0;i!=min(x1.size(),x2.size());++i) { x1[i]-=x2[i]; } return x1; } template optvec operator*(const optvec& x1,const optvec& x2) { optvec result(min(x1.size(),x2.size())); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]*x2[i]; } return result; } template optvec operator*(const optvec& x1,const T& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]*x2; } return result; } template optvec operator*(const T& x1,const optvec& x2) { optvec result(x2.size()); for(size_t i=0;i!=x2.size();++i) { result[i]=x2[i]*x1; } return result; } template optvec& operator*=(optvec& x1,const optvec& x2) { for(size_t i=0;i!=min(x1.size(),x2.size());++i) { x1[i]*=x2[i]; } return x1; } template optvec& operator*=(optvec& x1,const T& x2) { for(size_t i=0;i!=x1.size();++i) { x1[i]*=x2; } return x1; } template optvec operator/(const optvec& x1,const optvec& x2) { optvec result(min(x1.size(),x2.size())); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]/x2.at(i); } return result; } template optvec operator/(const optvec& x1,const T& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]/x2; } return result; } template optvec operator/(const T& x1,const optvec& x2) { optvec result(x2.size()); for(size_t i=0;i!=x2.size();++i) { result[i]=x1/x2[i]; } return result; } template optvec& operator/=(optvec& x1,const optvec& x2) { for(size_t i=0;i!=min(x1.size(),x2.size());++i) { x1[i]/=x2.at(i); } return x1; } template optvec& operator/=(optvec& x1,const T& x2) { for(size_t i=0;i!=x1.size();++i) { x1[i]/=x2; } return x1; } template T sum(const optvec& x) { T result=0; for(size_t i=0;i!=x.size();++i) { result+=x[i]; } return result; } template bool operator<(const optvec& x1,const optvec& x2) { for(size_t i=0;i!=min(x1.size(),x2.size());++i) { if(x1[i]!=x2[i]) { return x1[i] inline Ty randn(Ty y0,Ty y_err) { Ty y; do { y=(rand()/(Ty)RAND_MAX-(Ty).5)*(10*y_err)+y0; } while(rand()/(Ty)RAND_MAX>exp(-(y-y0)*(y-y0)/(y_err*y_err))); return y; } template optvec rand_norm(const optvec& y0, const optvec& y_err) { optvec result(y0.size()); for(int i=0;i \ opt_utilities::optvec _func(const opt_utilities::optvec& x) \ { \ opt_utilities::optvec result(x.size()); \ for(int i=0;i!=result.size();++i) \ { \ result[i]=_func(x[i]); \ } \ return result; \ } namespace std { DEF_VEC_FUNC(sin) DEF_VEC_FUNC(cos) DEF_VEC_FUNC(log) DEF_VEC_FUNC(sqrt) DEF_VEC_FUNC(exp) template opt_utilities::optvec pow(const opt_utilities::optvec& x,const T& y) { opt_utilities::optvec result(x.size()); for(int i=0;i!=result.size();++i) { result[i]=pow(x[i],y); } return result; } } #endif