00001 #ifndef animal_vectorvec_hpp___________________________
00002 #define animal_vectorvec_hpp___________________________
00003
00007 #include <animal/vector.h>
00008
00009 namespace animal {
00010
00021 template<class Vec>
00022 struct VectorVec : public animal::vector<Vec>
00023 {
00024
00026 VectorVec(){}
00027
00029 VectorVec( std::size_t s )
00030 : animal::vector<Vec>(s)
00031 {}
00032
00034 VectorVec( std::size_t s, Vec v )
00035 : animal::vector<Vec>(s,v)
00036 {}
00037
00038 };
00039
00042 template <class V> inline
00043 double v_dot( const VectorVec<V>& a, const VectorVec<V>& b )
00044 {
00045
00046
00047 double res = 0;
00048 typename animal::container_traits<VectorVec<V> const>::iterator ai,aend,bi;
00049 for( ai=animal::begin(a),aend=animal::end(a),bi=animal::begin(b); ai!=aend; ++ai, ++bi )
00050 {
00051
00052 res += animal::v_dot((*ai),(*bi));
00053
00054 }
00055 return res;
00056 }
00057
00059 template <class V> inline
00060 void v_eq ( VectorVec<V>& Y, const VectorVec<V>& X )
00061 {
00062 assert( animal::size(Y) == animal::size(X) );
00063 typename animal::container_traits<VectorVec<V> >::iterator Yi = animal::begin(Y), Yend=animal::end(Y);
00064 typename animal::container_traits<VectorVec<V> const>::iterator Xi = animal::begin(X);
00065 for( ; Yi!=Yend; ++Yi, ++Xi )
00066 *(Yi) = (*Xi);
00067 }
00068
00070 template <class V> inline
00071 void v_eq ( VectorVec<V>& Y, const VectorVec<V>& W, const double& a, const VectorVec<V>& X )
00072 {
00073 assert( animal::size(Y) == animal::size(X) );
00074 assert( animal::size(Y) == animal::size(W) );
00075 typename animal::container_traits<VectorVec<V> >::iterator Yi = animal::begin(Y), Yend=animal::end(Y);
00076 typename animal::container_traits<VectorVec<V> const>::iterator Xi = animal::begin(X), Wi=animal::begin(W);
00077 for( ; Yi!=Yend; ++Yi, ++Xi, ++Wi )
00078 *(Yi) = (*Wi) + (*Xi)*a;
00079 }
00080
00082 template <class V> inline
00083 void v_peq ( VectorVec<V>& Y, double a, const VectorVec<V>& X )
00084 {
00085 assert( animal::size(Y) == animal::size(X) );
00086 typename animal::container_traits<VectorVec<V> >::iterator Yi = animal::begin(Y), Yend=animal::end(Y);
00087 typename animal::container_traits<VectorVec<V> const>::iterator Xi = animal::begin(X);
00088 for( ; Yi!=Yend; ++Yi, ++Xi )
00089 *(Yi) += (*Xi)*a;
00090 }
00091
00093 template <class V> inline
00094 void v_meq ( VectorVec<V>& Y, const VectorVec<V>& X )
00095 {
00096 assert( animal::size(Y) == animal::size(X) );
00097 typename animal::container_traits<VectorVec<V> >::iterator Yi = animal::begin(Y), Yend=animal::end(Y);
00098 typename animal::container_traits<VectorVec<V> const>::iterator Xi = animal::begin(X);
00099 for( ; Yi!=Yend; ++Yi, ++Xi )
00100 *(Yi) -= (*Xi);
00101 }
00102
00104 template <class V> inline
00105 void v_teq ( VectorVec<V>& v, const double& a )
00106 {
00107 typename animal::container_traits<VectorVec<V> >::iterator Yi = animal::begin(v), Yend=animal::end(v);
00108 for( ; Yi!=Yend; ++Yi )
00109 *(Yi) *= a;
00110 }
00111
00113 template <class V> inline
00114 double v_norm( const VectorVec<V>& a ){ return sqrt(v_dot(a,a)); }
00115
00116
00117 }
00118
00119 #endif