31 #ifndef XMIPP_VECTOR_OPS_H 32 #define XMIPP_VECTOR_OPS_H 51 template<
class T> std::vector<T>
operator+(
const std::vector<T>& v,
const T&
a)
53 std::vector<T> tmp = v;
54 transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(std::plus<T>(), a));
63 template<
class T> std::vector<T>
operator+(
const T&
a,
const std::vector<T>& v)
65 std::vector<T> tmp = v;
66 transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(std::plus<T>(), a));
75 template<
class T> std::vector<T>
operator-(
const std::vector<T>& v,
const T&
a)
77 std::vector<T> tmp = v;
78 transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(std::minus<T>(), a));
87 template<
class T> std::vector<T>
operator-(
const T&
a,
const std::vector<T>& v)
89 std::vector<T> tmp(v.size(),
a);
90 transform(tmp.begin(), tmp.end(), v.begin(), tmp.begin(), std::minus<T>());
99 template<
class T> std::vector<T>
operator*(
const std::vector<T>& v, T
a)
101 std::vector<T> tmp = v;
102 transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(std::multiplies<T>(), a));
111 template<
class T> std::vector<T>
operator*(T
a,
const std::vector<T>& v)
113 std::vector<T> tmp = v;
114 transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(std::multiplies<T>(), a));
124 template<
class T> std::vector<T>
operator/(
const std::vector<T>& v, T
a)
126 std::vector<T> tmp = v;
127 transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(std::divides<T>(), a));
136 template<
class T> std::vector<T>
operator/(T
a,
const std::vector<T>& v)
138 std::vector<T> tmp(v.size(),
a);
139 transform(tmp.begin(), tmp.end(), v.begin(), tmp.begin(), std::divides<T>());
148 template<
class T> std::vector<T>&
operator*=(std::vector<T>&
v1,
const std::vector<T>& v2)
150 transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), std::multiplies<T>());
159 template<
class T> std::vector<T>&
operator/=(std::vector<T>&
v1,
const std::vector<T>& v2)
161 transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), std::divides<T>());
178 std::vector<T> v(_size);
179 std::random_device rd;
180 std::mt19937 gen(rd());
181 std::uniform_real_distribution<> dist(_lower, _upper);
182 std::generate(v.begin(), v.end(), [&]{
return dist(gen); });
193 std::vector<T>&
operator += (std::vector<T>& _v1,
const std::vector<T>& _v2)
195 if (_v1.size() != _v2.size())
196 throw std::runtime_error(
"different size vectors in +=");
198 transform(_v1.begin(), _v1.end(), _v2.begin(), _v1.begin(),
211 std::vector<T>&
operator -= (std::vector<T>& _v1,
const std::vector<T>& _v2)
213 if (_v1.size() != _v2.size())
214 throw std::runtime_error(
"different size vectors in -=");
216 transform(_v1.begin(), _v1.end(), _v2.begin(), _v1.begin(),
229 std::vector<T>
operator + (
const std::vector<T>& _v1,
const std::vector<T>& _v2)
231 if (_v1.size() != _v2.size())
232 throw std::runtime_error(
"different size vectors in +");
235 std::vector<T> tmp(_v1.size());
237 transform(_v1.begin(), _v1.end(), _v2.begin(), tmp.begin(),
249 std::vector<T>
operator - (
const std::vector<T>& _v1,
const std::vector<T>& _v2)
251 if (_v1.size() != _v2.size())
252 throw std::runtime_error(
"different size vectors in -");
255 std::vector<T> tmp(_v1.size());
257 transform(_v1.begin(), _v1.end(), _v2.begin(), tmp.begin(),
269 T
operator *(
const std::vector<T>& _v1,
const std::vector<T>& _v2)
271 if (_v1.size() != _v2.size())
272 throw std::runtime_error(
"different size vectors in *");
275 typename std::vector<T>::const_iterator
i;
276 typename std::vector<T>::const_iterator
j;
277 for (i = _v1.begin(), j = _v2.begin() ; i != _v1.end() ; i++, j++)
291 typename std::vector<T>::iterator
i;
292 for (i = _v.begin() ; i != _v.end() ; i++)
306 typename std::vector<T>::iterator
i;
307 for (i = _v.begin() ; i != _v.end() ; i++)
319 std::ostream& operator << (std::ostream& _os, const std::vector<T>& _v)
322 typename std::vector<T>::const_iterator
i;
323 for (i = _v.begin(); i != _v.end(); i++) _os << *i <<
" ";
343 _is.setstate(std::ios::failbit);
347 while (_is && !finish)
370 throw std::runtime_error(
"Error reading the vector");
379 if (_v1.size() != _v2.size())
380 throw std::runtime_error(
"vector of different size in eDist");
383 auto i = _v1.begin();
384 auto j = _v2.begin();
385 for (;
i < _v1.end();
i++,
j++)
387 double tmp = (double)(*
i) - (double)(*
j);
399 T
norm(
const std::vector<T>& v)
402 typename std::vector<T>::const_iterator
i;
403 for (i = v.begin(); i != v.end(); i++)
404 sum += (
double)(*i) * (double)(*i);
405 return (T)
sqrt(sum);
std::istream & operator>>(std::istream &_is, std::vector< T > &_v)
double euclideanDistance(const std::vector< T > &_v1, const std::vector< T > &_v2)
void sqrt(Image< double > &op)
std::vector< T > operator+(const std::vector< T > &v, const T &a)
std::vector< T > operator/(const std::vector< T > &v, T a)
T norm(const std::vector< T > &v)
std::vector< T > operator-(const std::vector< T > &v, const T &a)
std::vector< T > & operator-=(std::vector< T > &_v1, const std::vector< T > &_v2)
basic_istream< char, std::char_traits< char > > istream
std::vector< T > & operator+=(std::vector< T > &_v1, const std::vector< T > &_v2)
std::vector< T > operator*(const std::vector< T > &v, T a)
std::vector< T > & operator/=(std::vector< T > &v1, const std::vector< T > &v2)
std::vector< T > & operator*=(std::vector< T > &v1, const std::vector< T > &v2)
std::vector< T > randomVector(const unsigned &_size, const T &_lower, const T &_upper)