vecop.h

00001 //-----------------------------------------------------------------------------
00002 // vecop.h
00003 //-----------------------------------------------------------------------------
00004 
00005 #ifndef VECOP_H
00006 #define VECOP_H
00007 
00008 //-----------------------------------------------------------------------------
00009 
00010 #include <iostream>    // ostream istream
00011 #include <vector>      // vector
00012 #include <functional>  // plus minus multiplies divides
00013 #include <numeric>     // inner_product
00014 
00015 //-----------------------------------------------------------------------------
00016 // vector + vector
00017 //-----------------------------------------------------------------------------
00018 
00019 template<class T> vector<T> operator+(const vector<T>& v1, const vector<T>& v2)
00020 {
00021   vector<T> tmp = v1;
00022   transform(tmp.begin(), tmp.end(), v2.begin(), tmp.begin(), plus<T>());
00023   return tmp;
00024 }
00025 
00026 template<class T> vector<T> operator-(const vector<T>& v1, const vector<T>& v2)
00027 {
00028   vector<T> tmp = v1;
00029   transform(tmp.begin(), tmp.end(), v2.begin(), tmp.begin(), minus<T>());
00030   return tmp;
00031 }
00032 
00033 template<class T> T operator*(const vector<T>& v1, const vector<T>& v2)
00034 {
00035   return inner_product(v1.begin(), v1.end(), v2.begin(), static_cast<T>(0));
00036 }
00037 
00038 template<class T> T operator/(const vector<T>& v1, const vector<T>& v2)
00039 {
00040   return inner_product(v1.begin(), v1.end(), v2.begin(), static_cast<T>(0),
00041                        plus<T>(), divides<T>());
00042 }
00043 
00044 //-----------------------------------------------------------------------------
00045 // vector += vector
00046 //-----------------------------------------------------------------------------
00047 
00048 template<class T> vector<T>& operator+=(vector<T>& v1, const vector<T>& v2)
00049 {
00050   transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), plus<T>());
00051   return v1;
00052 }
00053 
00054 template<class T> vector<T>& operator-=(vector<T>& v1, const vector<T>& v2)
00055 {
00056   transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), minus<T>());
00057   return v1;
00058 }
00059 
00060 //-----------------------------------------------------------------------------
00061 // vector + number
00062 //-----------------------------------------------------------------------------
00063 
00064 template<class A, class B> vector<A> operator+(const vector<A>& a, const B& b)
00065 {
00066   vector<A> tmp = a;
00067   transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(plus<A>(), b));
00068   return tmp;
00069 }
00070 
00071 template<class A, class B> vector<A> operator-(const vector<A>& a, const B& b)
00072 {
00073   vector<A> tmp = a;
00074   transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(minus<A>(), b));
00075   return tmp;
00076 }
00077 
00078 template<class A, class B> vector<A> operator*(const vector<A>& a, const B& b)
00079 {
00080   vector<A> tmp = a;
00081   transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(multiplies<A>(), b));
00082   return tmp;
00083 }
00084 
00085 template<class A, class B> vector<A> operator/(const vector<A>& a, const B& b)
00086 {
00087   vector<A> tmp = a;
00088   transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(divides<A>(), b));
00089   return tmp;
00090 }
00091 
00092 //-----------------------------------------------------------------------------
00093 // number + vector
00094 //-----------------------------------------------------------------------------
00095 
00096 template<class A, class B> vector<A> operator+(const B& b, const vector<A>& a)
00097 {
00098   vector<A> tmp = a;
00099   transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(plus<A>(), b));
00100   return tmp;
00101 }
00102 
00103 template<class A, class B> vector<A> operator-(const B& b, const vector<A>& a)
00104 {
00105   vector<A> tmp(a.size(), b);
00106   transform(tmp.begin(), tmp.end(), a.begin(), tmp.begin(), minus<A>());
00107   return tmp;
00108 }
00109 
00110 template<class A, class B> vector<A> operator*(const B& b, const vector<A>& a)
00111 {
00112   vector<A> tmp = a;
00113   transform(tmp.begin(), tmp.end(), tmp.begin(), bind2nd(multiplies<A>(), b));
00114   return tmp;
00115 }
00116 
00117 template<class A, class B> vector<A> operator/(const B& b, const vector<A>& a)
00118 {
00119   vector<A> tmp(a.size(), b);
00120   transform(tmp.begin(), tmp.end(), a.begin(), tmp.begin(), divides<A>());
00121   return tmp;
00122 }
00123 
00124 //-----------------------------------------------------------------------------
00125 // vector += number
00126 //-----------------------------------------------------------------------------
00127 
00128 template<class A, class B> vector<A>& operator+=(vector<A>& a, const B& b)
00129 {
00130   transform(a.begin(), a.end(), a.begin(), bind2nd(plus<A>(), b));
00131   return a;
00132 }
00133 
00134 template<class A, class B> vector<A>& operator-=(vector<A>& a, const B& b)
00135 {
00136   transform(a.begin(), a.end(), a.begin(), bind2nd(minus<A>(), b));
00137   return a;
00138 }
00139 
00140 template<class A, class B> vector<A>& operator*=(vector<A>& a, const B& b)
00141 {
00142   transform(a.begin(), a.end(), a.begin(), bind2nd(multiplies<A>(), b));
00143   return a;
00144 }
00145 
00146 template<class A, class B> vector<A>& operator/=(vector<A>& a, const B& b)
00147 {
00148   transform(a.begin(), a.end(), a.begin(), bind2nd(divides<A>(), b));
00149   return a;
00150 }
00151 
00152 //-----------------------------------------------------------------------------
00153 // I/O
00154 //-----------------------------------------------------------------------------
00155 
00156 template<class T> ostream& operator<<(ostream& os, const vector<T>& v)
00157 {
00158   os << '<';
00159   if (v.size())
00160     {
00161       copy(v.begin(), v.end() - 1, ostream_iterator<T>(os, " "));
00162       os << v.back();
00163     } 
00164   return os << '>';
00165 }
00166 
00167 template<class T> istream& operator>>(istream& is, vector<T>& v)
00168 {
00169   v.clear();
00170   
00171   char c;
00172   is >> c;
00173   if (!is || c != '<')
00174     is.setstate(ios::failbit);
00175   else
00176     {
00177       T t;
00178       do {
00179         is >> c;
00180         if (is && c!= '>')
00181           {
00182             is.putback(c);
00183             is >> t;
00184             if (is)
00185               v.push_back(t);
00186           }
00187       } while (is && c != '>');
00188     }
00189   
00190   return is;
00191 }
00192 
00193 //-----------------------------------------------------------------------------
00194 // euclidean_distance
00195 //-----------------------------------------------------------------------------
00196 
00197 template<class T> T euclidean_distance(const vector<T>& v1, 
00198                                        const vector<T>& v2)
00199 {
00200   T sum = 0, tmp;
00201   
00202   for (unsigned i = 0; i < v1.size(); ++i)
00203     {
00204       tmp = v1[i] - v2[i];
00205       sum += tmp * tmp;
00206     }
00207 
00208   return sqrt(sum);
00209 }
00210 
00211 //-----------------------------------------------------------------------------
00212 
00213 #endif
00214 

Generated on Thu Oct 19 05:06:44 2006 for EO by  doxygen 1.3.9.1