00001 /*************************************************************************** 00002 numvector.h - vector for numeric types 00003 ------------------- 00004 begin : Tue Apr 25 2000 00005 copyright : (C) 2000 by Michael Peeters 00006 email : Michael.Peeters@vub.ac.be 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 00015 * * 00016 ***************************************************************************/ 00017 00018 #ifndef NUMVECTOR_H 00019 #define NUMVECTOR_H 00020 00021 #include <vector> 00022 #include <stdexcept> 00023 #include "numerictypes.h" 00024 #include "numerictraits.h" 00025 00026 namespace MODEL { 00027 00031 // Previously: template<integer dims, class NT = NumericTraits<number, dims> > 00032 template<integer dims, typename nelem=number, class NT = NumericTraits<nelem,dims> > 00033 class NumVector : public std::vector<typename NT::number> 00034 { 00035 public: 00036 typedef typename NT::number number; 00037 typedef typename NT::number numT; // old code 00038 typedef typename NT::vect vect; // make life easier 00039 typedef std::vector<number> base; // base type 00040 00042 NumVector(const numT& init=0.) 00043 {this->resize(dims,init);} 00044 virtual ~NumVector() {} 00045 00049 NumVector(const numT Tarray[]) 00050 { this->resize(dims); 00051 for(integer i=0;i<dims;i++) (*this)[i]=Tarray[i];} 00052 00054 NumVector* clone(void){return new NumVector(*this);} 00055 00057 NumVector(const NumVector& vcopy) : base(vcopy) {} 00058 00060 const NumVector& operator=(const NumVector& vassign) 00061 { if (this!=&vassign) base::operator=(vassign); return *this; } 00062 00064 const numT& operator[](integer i) const 00065 { 00066 // removed bounds checking for speed 00067 return std::vector<typename NT::number>::operator[](i); 00068 // if (i>=0&&i<dims) return std::vector<typename NT::number>::operator[](i); 00069 // else throw std::logic_error("array value out of bounds"); 00070 return (*this)[0]; // this should _never_ happen 00071 } 00072 00074 numT& operator[](integer i) 00075 { 00076 if (i>=0&&i<dims) return std::vector<typename NT::number>::operator[](i); 00077 else throw std::logic_error("array value out of bounds"); 00078 return (*this)[0]; // this should _never_ happen 00079 } 00080 00081 // Arithmetic Operators 00082 // This will be taken over by PETE, undoubtedly 00083 00084 NumVector& operator+=(const NumVector& nvplus) 00085 { for(integer i=0;i<dims;i++) (*this)[i]+=nvplus[i]; return *this; } 00086 00087 NumVector& operator-=(const NumVector& nvmin) 00088 { for(integer i=0;i<dims;i++) (*this)[i]-=nvmin[i]; return *this; } 00089 00090 NumVector& operator/=(const numT& nvdiv) 00091 { for(integer i=0;i<dims;i++) (*this)[i]/=nvdiv; return *this; } 00092 00093 NumVector& operator*=(const numT& nvmul) 00094 { for(integer i=0;i<dims;i++) (*this)[i] *= nvmul; return *this; } 00095 00096 friend NumVector operator*<dims, nelem, NT>(const numT& nvmul, const NumVector& nv); 00097 friend NumVector operator/<dims, nelem, NT>(const NumVector& nvmul, const numT& nv); 00098 00099 00100 friend NumVector operator+<dims, nelem, NT>(const NumVector& nvmul, const NumVector& nv); 00101 00102 friend NumVector operator-<dims, nelem, NT>(const NumVector& nvmul, const NumVector& nv); 00103 00105 /* 00106 friend numT operator*<dims,NT>(const NumVector& nv, 00107 const NumVector& nvmul); 00108 */ 00109 // /** Compute the scalar product correct for complex types */ 00110 // friend real operator*(const NumVector< std::complex<numT> ,dims>& nv, 00111 // const NumVector< std::complex<numT>,dims>& nvmul); 00112 00115 friend numT norm<dims,nelem,NT>(const NumVector& nv) ; 00116 00118 friend numT length<dims,nelem,NT>(const NumVector& nv); 00119 00120 friend NumVector operator-<dims,nelem,NT>(const NumVector& m); 00121 }; 00122 00123 // Previously: template<integer dims, class NT> 00124 template <integer dims, typename nelem, class NT > 00125 inline 00126 NumVector<dims,nelem,NT> 00127 operator-(const NumVector<dims,nelem,NT>& m) 00128 { 00129 NumVector<dims,nelem,NT> v(m); 00130 const typename NT::number minus(-1.); 00131 v*=minus; 00132 return v; 00133 } 00134 00135 00136 // Previously: template<integer dims, class NT> 00137 template <integer dims, typename nelem, class NT > 00138 inline 00139 NumVector<dims, nelem, NT> 00140 operator*(const typename NT::number& nvmul, const NumVector<dims,nelem,NT>& nv) 00141 { 00142 NumVector<dims,nelem,NT> res(nv); 00143 return res*=nvmul; 00144 } 00145 00146 template <integer dims, typename nelem, class NT > 00147 inline 00148 NumVector<dims, nelem, NT> 00149 operator/(const NumVector<dims,nelem,NT>& nvmul, const typename NT::number& nv) 00150 { 00151 NumVector<dims,nelem,NT> res(nvmul); 00152 return res/=nv; 00153 } 00154 00155 // Previously: template<integer dims, class NT> 00156 template <integer dims, typename nelem, class NT > 00157 inline 00158 NumVector<dims,nelem,NT> 00159 operator+(const NumVector<dims,nelem,NT>& nvmul, const NumVector<dims,nelem,NT>& nv) 00160 { 00161 NumVector<dims,nelem,NT> res(nv); 00162 return res+=nvmul; 00163 } 00164 00165 template <integer dims, typename nelem, class NT > 00166 inline 00167 NumVector<dims,nelem,NT> 00168 operator-(const NumVector<dims,nelem,NT>& nvmul, const NumVector<dims,nelem,NT>& nv) 00169 { 00170 NumVector<dims,nelem,NT> res(nvmul); 00171 return res-=nv; 00172 } 00173 00177 // Previously: template<integer dims, class NT> 00178 template <integer dims, typename nelem, class NT > 00179 inline 00180 typename NT::number 00181 operator*(const NumVector<dims,nelem,NT>& nv,const NumVector<dims,nelem,NT>& nvmul) 00182 { 00183 typename NT::number r=0.0; 00184 for(integer i=0;i<dims;i++) r += nv[i]*nvmul[i]; return r; 00185 } 00186 00188 // */ 00189 //template<typename numT, integer dims> 00190 //inline 00191 //real operator*(const NumVector< std::complex<numT> ,dims>& nv,const NumVector< std::complex<numT>,dims>& nvmul) 00192 //{ 00193 // real r=0.0; 00194 // for(integer i=0;i<dims;i++) r += nv[i].real()*nvmul[i].real()+nv[i].imag()*nvmul[i].imag(); return r; 00195 //} 00196 00197 // Previously: template<integer dims, class NT> 00198 template <integer dims, typename nelem, class NT > 00199 typename NT::number 00200 norm(const NumVector<dims,nelem,NT>& nv) 00201 { 00202 return nv*nv; 00203 } 00204 00205 // Previously: template<integer dims, class NT> 00206 template <integer dims, typename nelem, class NT > 00207 typename NT::number 00208 length(const NumVector<dims,nelem,NT>& nv) 00209 { 00210 return sqrt(norm(nv)); 00211 } 00212 00213 } // end namespace MODEL 00214 #endif 00215 00216 /********************************************************************* 00217 $Id: numvector.h,v 1.1 2001/05/22 10:54:55 mpeeters Exp $ 00218 ********************************************************************** 00219 00220 $Log: numvector.h,v $ 00221 Revision 1.1 2001/05/22 10:54:55 mpeeters 00222 Moved sources and headers for libModel to model/ subdirectory, in an attempt to rationalize the source tree. This should make things "netter". 00223 00224 Revision 1.3 2001/05/21 11:53:16 mpeeters 00225 Removed Makefile.in, which is automatically generated anyway. 00226 00227 Revision 1.2 2000/09/15 10:26:31 mpeeters 00228 Cleaned out header and added CVS tails to files, removed superfuous 00229 @author comments, inserted dates 00230 00231 *********************************************************************/
More Info? Michael Peeters. Also, check our research website: www.alna.vub.ac.be
Last update: June 2002.