/home/coin/SVN-release/CoinAll-1.1.0/CoinUtils/src/CoinDenseVector.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2003, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #ifndef CoinDenseVector_H
00004 #define CoinDenseVector_H
00005 
00006 #if defined(_MSC_VER)
00007 // Turn off compiler warning about long names
00008 #  pragma warning(disable:4786)
00009 #endif
00010 
00011 #include <cassert>
00012 #include <cstdlib>
00013 #include <cmath>
00014 #include "CoinHelperFunctions.hpp"
00015 
00016 //#############################################################################
00022     template <typename T> void
00023     CoinDenseVectorUnitTest(T dummy);
00024 
00025 //#############################################################################
00064 template <typename T> class CoinDenseVector {
00065 private:
00068 
00069    int nElements_;
00071    T * elements_;
00073   
00074 public:
00077 
00078    inline int getNumElements() const { return nElements_; }
00079    inline int size() const { return nElements_; }
00081    inline const T * getElements() const { return elements_; }
00083    inline T * getElements() { return elements_; }
00085  
00086    //-------------------------------------------------------------------
00087    // Set indices and elements
00088    //------------------------------------------------------------------- 
00091 
00092    void clear();
00094    CoinDenseVector & operator=(const CoinDenseVector &);
00096    T & operator[](int index) const;
00097 
00102    void setVector(int size, const T * elems);
00103 
00104   
00106    void setConstant(int size, T elems);
00107   
00108 
00112    void setElement(int index, T element);
00116    void resize(int newSize, T fill=T()); 
00117 
00119    void append(const CoinDenseVector &);
00121 
00124 
00125    inline T oneNorm() const {
00126      T norm = 0;
00127      for (int i=0; i<nElements_; i++)
00128        norm += CoinAbs(elements_[i]);
00129      return norm;
00130    }
00132    inline double twoNorm() const {
00133      double norm = 0.;
00134      for (int i=0; i<nElements_; i++)
00135        norm += elements_[i] * elements_[i];
00136      // std namespace removed because it was causing a compile
00137      // problem with Microsoft Visual C++
00138      return /*std::*/sqrt(norm);
00139    }
00141    inline T infNorm() const {
00142      T norm = 0;
00143      for (int i=0; i<nElements_; i++)
00144        norm = CoinMax(norm, CoinAbs(elements_[i]));
00145      return norm;
00146    }
00148    inline T sum() const {
00149      T sume = 0;
00150      for (int i=0; i<nElements_; i++)
00151        sume += elements_[i];
00152      return sume;
00153    }
00155    inline void scale(T factor) {
00156      for (int i=0; i<nElements_; i++)
00157        elements_[i] *= factor;
00158      return;
00159    }
00161 
00164 
00165    void operator+=(T value);
00167    void operator-=(T value);
00169    void operator*=(T value);
00171    void operator/=(T value);
00173 
00177    CoinDenseVector();
00179    CoinDenseVector(int size, const T * elems);
00181    CoinDenseVector(int size, T element=T());
00183    CoinDenseVector(const CoinDenseVector &);
00184 
00186    ~CoinDenseVector ();
00188     
00189 private:
00192 
00193    void gutsOfSetVector(int size, const T * elems);
00195    void gutsOfSetConstant(int size, T value);
00197 };
00198 
00199 //#############################################################################
00200 
00208 
00209 template <typename T> inline
00210 CoinDenseVector<T> operator+(const CoinDenseVector<T>& op1,
00211                              const CoinDenseVector<T>& op2){
00212   assert(op1.size() == op2.size());
00213   int size = op1.size();
00214   CoinDenseVector<T> op3(size);
00215   const T *elements1 = op1.getElements();
00216   const T *elements2 = op2.getElements();
00217   T *elements3 = op3.getElements();
00218   for(int i=0; i<size; i++)
00219     elements3[i] = elements1[i] + elements2[i];
00220   return op3;
00221 }
00222 
00224 template <typename T> inline
00225 CoinDenseVector<T> operator-(const CoinDenseVector<T>& op1,
00226                              const CoinDenseVector<T>& op2){
00227   assert(op1.size() == op2.size());
00228   int size = op1.size();
00229   CoinDenseVector<T> op3(size);
00230   const T *elements1 = op1.getElements();
00231   const T *elements2 = op2.getElements();
00232   T *elements3 = op3.getElements();
00233   for(int i=0; i<size; i++)
00234     elements3[i] = elements1[i] - elements2[i];
00235   return op3;
00236 }
00237 
00238 
00240 template <typename T> inline
00241 CoinDenseVector<T> operator*(const CoinDenseVector<T>& op1,
00242                           const CoinDenseVector<T>& op2){
00243   assert(op1.size() == op2.size());
00244   int size = op1.size();
00245   CoinDenseVector<T> op3(size);
00246   const T *elements1 = op1.getElements();
00247   const T *elements2 = op2.getElements();
00248   T *elements3 = op3.getElements();
00249   for(int i=0; i<size; i++)
00250     elements3[i] = elements1[i] * elements2[i];
00251   return op3;
00252 }
00253 
00255 template <typename T> inline
00256 CoinDenseVector<T> operator/(const CoinDenseVector<T>& op1,
00257                           const CoinDenseVector<T>& op2){
00258   assert(op1.size() == op2.size());
00259   int size = op1.size();
00260   CoinDenseVector<T> op3(size);
00261   const T *elements1 = op1.getElements();
00262   const T *elements2 = op2.getElements();
00263   T *elements3 = op3.getElements();
00264   for(int i=0; i<size; i++)
00265     elements3[i] = elements1[i] / elements2[i];
00266   return op3;
00267 }
00269 
00275 
00276 template <typename T> inline
00277 CoinDenseVector<T> operator+(const CoinDenseVector<T>& op1, T value){
00278   int size = op1.size();
00279   CoinDenseVector<T> op3(size);
00280   const T *elements1 = op1.getElements();
00281   T *elements3 = op3.getElements();
00282   double dvalue = value;
00283   for(int i=0; i<size; i++)
00284     elements3[i] = elements1[i] + dvalue;
00285   return op3;
00286 }
00287 
00289 template <typename T> inline
00290 CoinDenseVector<T> operator-(const CoinDenseVector<T>& op1, T value){
00291   int size = op1.size();
00292   CoinDenseVector<T> op3(size);
00293   const T *elements1 = op1.getElements();
00294   T *elements3 = op3.getElements();
00295   double dvalue = value;
00296   for(int i=0; i<size; i++)
00297     elements3[i] = elements1[i] - dvalue;
00298   return op3;
00299 }
00300 
00302 template <typename T> inline
00303 CoinDenseVector<T> operator*(const CoinDenseVector<T>& op1, T value){
00304   int size = op1.size();
00305   CoinDenseVector<T> op3(size);
00306   const T *elements1 = op1.getElements();
00307   T *elements3 = op3.getElements();
00308   double dvalue = value;
00309   for(int i=0; i<size; i++)
00310     elements3[i] = elements1[i] * dvalue;
00311   return op3;
00312 }
00313 
00315 template <typename T> inline
00316 CoinDenseVector<T> operator/(const CoinDenseVector<T>& op1, T value){
00317   int size = op1.size();
00318   CoinDenseVector<T> op3(size);
00319   const T *elements1 = op1.getElements();
00320   T *elements3 = op3.getElements();
00321   double dvalue = value;
00322   for(int i=0; i<size; i++)
00323     elements3[i] = elements1[i] / dvalue;
00324   return op3;
00325 }
00326 
00328 template <typename T> inline
00329 CoinDenseVector<T> operator+(T value, const CoinDenseVector<T>& op1){
00330   int size = op1.size();
00331   CoinDenseVector<T> op3(size);
00332   const T *elements1 = op1.getElements();
00333   T *elements3 = op3.getElements();
00334   double dvalue = value;
00335   for(int i=0; i<size; i++)
00336     elements3[i] = elements1[i] + dvalue;
00337   return op3;
00338 }
00339 
00341 template <typename T> inline
00342 CoinDenseVector<T> operator-(T value, const CoinDenseVector<T>& op1){
00343   int size = op1.size();
00344   CoinDenseVector<T> op3(size);
00345   const T *elements1 = op1.getElements();
00346   T *elements3 = op3.getElements();
00347   double dvalue = value;
00348   for(int i=0; i<size; i++)
00349     elements3[i] = dvalue - elements1[i];
00350   return op3;
00351 }
00352 
00354 template <typename T> inline
00355 CoinDenseVector<T> operator*(T value, const CoinDenseVector<T>& op1){
00356   int size = op1.size();
00357   CoinDenseVector<T> op3(size);
00358   const T *elements1 = op1.getElements();
00359   T *elements3 = op3.getElements();
00360   double dvalue = value;
00361   for(int i=0; i<size; i++)
00362     elements3[i] = elements1[i] * dvalue;
00363   return op3;
00364 }
00365 
00367 template <typename T> inline
00368 CoinDenseVector<T> operator/(T value, const CoinDenseVector<T>& op1){
00369   int size = op1.size();
00370   CoinDenseVector<T> op3(size);
00371   const T *elements1 = op1.getElements();
00372   T *elements3 = op3.getElements();
00373   double dvalue = value;
00374   for(int i=0; i<size; i++)
00375     elements3[i] = dvalue / elements1[i];
00376   return op3;
00377 }
00379 
00380 #endif

Generated on Sun Nov 14 14:06:32 2010 for Coin-All by  doxygen 1.4.7