vec.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:7k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Template Numerical Toolkit (TNT) for Linear Algebra
  2. //
  3. // BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
  4. // Please see http://math.nist.gov/tnt for updates
  5. //
  6. // R. Pozo
  7. // Mathematical and Computational Sciences Division
  8. // National Institute of Standards and Technology
  9. // Basic TNT  numerical vector (0-based [i] AND (i) indexing )
  10. //
  11. #ifndef VEC_H
  12. #define VEC_H
  13. #include "subscrpt.h"
  14. #include <stdlib.h>
  15. #include <assert.h>
  16. #include <iostream.h>
  17. #include <strstream.h>
  18. template <class T>
  19. class Vector 
  20. {
  21.   public:
  22.     typedef Subscript   size_type;
  23.     typedef         T   value_type;
  24.     typedef         T   element_type;
  25.     typedef         T*  pointer;
  26.     typedef         T*  iterator;
  27.     typedef         T&  reference;
  28.     typedef const   T*  const_iterator;
  29.     typedef const   T&  const_reference;
  30.     Subscript lbound() const { return 1;}
  31.  
  32.   protected:
  33.     T* v_;                  
  34.     T* vm1_;        // pointer adjustment for optimzied 1-offset indexing
  35.     Subscript n_;
  36.     // internal helper function to create the array
  37.     // of row pointers
  38.     void initialize(Subscript N)
  39.     {
  40.         // adjust pointers so that they are 1-offset:
  41.         // v_[] is the internal contiguous array, it is still 0-offset
  42.         //
  43.         assert(v_ == NULL);
  44.         v_ = new T[N];
  45.         assert(v_  != NULL);
  46.         vm1_ = v_-1;
  47.         n_ = N;
  48.     }
  49.    
  50.     void copy(const T*  v)
  51.     {
  52.         Subscript N = n_;
  53.         Subscript i;
  54. #ifdef TNT_UNROLL
  55.         Subscript Nmod4 = N & 4;
  56.         Subscript N4 = N - Nmod4;
  57.         for (i=0; i<N4; i+=4)
  58.         {
  59.             v_[i] = v[i];
  60.             v_[i+1] = v[i+1];
  61.             v_[i+2] = v[i+2];
  62.             v_[i+3] = v[i+3];
  63.         }
  64.         for (i=N4; i< N; i++)
  65.             v_[i] = v[i];
  66. #else
  67.         for (i=0; i< N; i++)
  68.             v_[i] = v[i];
  69. #endif      
  70.     }
  71.     void set(const T& val)
  72.     {
  73.         Subscript N = n_;
  74.         Subscript i;
  75. #ifdef TNT_UNROLL
  76.         Subscript Nmod4 = N & 4;
  77.         Subscript N4 = N - Nmod4;
  78.         for (i=0; i<N4; i+=4)
  79.         {
  80.             v_[i] = val;
  81.             v_[i+1] = val;
  82.             v_[i+2] = val;
  83.             v_[i+3] = val; 
  84.         }
  85.         for (i=N4; i< N; i++)
  86.             v_[i] = val;
  87. #else
  88.         for (i=0; i< N; i++)
  89.             v_[i] = val;
  90.         
  91. #endif      
  92.     }
  93.     
  94.     void destroy()
  95.     {     
  96.         /* do nothing, if no memory has been previously allocated */
  97.         if (v_ == NULL) return ;
  98.         /* if we are here, then matrix was previously allocated */
  99.         delete [] (v_);     
  100.         v_ = NULL;
  101.         vm1_ = NULL;
  102.     }
  103.   public:
  104.     // access
  105.     iterator begin() { return v_;}
  106.     iterator end()   { return v_ + n_; }
  107.     const iterator begin() const { return v_;}
  108.     const iterator end() const  { return v_ + n_; }
  109.     // destructor
  110.     ~Vector() 
  111.     {
  112.         destroy();
  113.     }
  114.     // constructors
  115.     Vector() : v_(0), vm1_(0), n_(0)  {};
  116.     Vector(const Vector<T> &A) : v_(0), vm1_(0), n_(0)
  117.     {
  118.         initialize(A.n_);
  119.         copy(A.v_);
  120.     }
  121.     Vector(Subscript N, const T& value = T(0)) :  v_(0), vm1_(0), n_(0)
  122.     {
  123.         initialize(N);
  124.         set(value);
  125.     }
  126.     Vector(Subscript N, const T* v) :  v_(0), vm1_(0), n_(0)
  127.     {
  128.         initialize(N);
  129.         copy(v);
  130.     }
  131.     Vector(Subscript N, char *s) :  v_(0), vm1_(0), n_(0)
  132.     {
  133.         initialize(N);
  134.         istrstream ins(s);
  135.         Subscript i;
  136.         for (i=0; i<N; i++)
  137.                 ins >> v_[i];
  138.     }
  139.     // methods
  140.     // 
  141.     Vector<T>& newsize(Subscript N)
  142.     {
  143.         if (n_ == N) return *this;
  144.         destroy();
  145.         initialize(N);
  146.         return *this;
  147.     }
  148.     // assignments
  149.     //
  150.     Vector<T>& operator=(const Vector<T> &A)
  151.     {
  152.         if (v_ == A.v_)
  153.             return *this;
  154.         if (n_ == A.n_)         // no need to re-alloc
  155.             copy(A.v_);
  156.         else
  157.         {
  158.             destroy();
  159.             initialize(A.n_);
  160.             copy(A.v_);
  161.         }
  162.         return *this;
  163.     }
  164.         
  165.     Vector<T>& operator=(const T& scalar)
  166.     { 
  167.         set(scalar);  
  168.         return *this;
  169.     }
  170.     Subscript dim() const 
  171.     {
  172.         return  n_; 
  173.     }
  174.     Subscript size() const 
  175.     {
  176.         return  n_; 
  177.     }
  178.     inline reference operator()(Subscript i)
  179.     { 
  180. #ifdef TNT_BOUNDS_CHECK
  181.         assert(1<=i);
  182.         assert(i <= n_) ;
  183. #endif
  184.         return vm1_[i]; 
  185.     }
  186.     inline const_reference operator() (Subscript i) const
  187.     {
  188. #ifdef TNT_BOUNDS_CHECK
  189.         assert(1<=i);
  190.         assert(i <= n_) ;
  191. #endif
  192.         return vm1_[i]; 
  193.     }
  194.     inline reference operator[](Subscript i)
  195.     { 
  196. #ifdef TNT_BOUNDS_CHECK
  197.         assert(0<=i);
  198.         assert(i < n_) ;
  199. #endif
  200.         return v_[i]; 
  201.     }
  202.     inline const_reference operator[](Subscript i) const
  203.     {
  204. #ifdef TNT_BOUNDS_CHECK
  205.         assert(0<=i);
  206.         assert(i < n_) ;
  207. #endif
  208.         return v_[i]; 
  209.     }
  210.     friend istream& operator>>(istream &s, Vector<T> &A);
  211. };
  212. /* ***************************  I/O  ********************************/
  213. template <class T>
  214. ostream& operator<<(ostream &s, const Vector<T> &A)
  215. {
  216.     Subscript N=A.dim();
  217.     s <<  N << endl;
  218.     for (Subscript i=0; i<N; i++)
  219.         s   << A[i] << " " << endl;
  220.     s << endl;
  221.     return s;
  222. }
  223. template <class T>
  224. istream& operator>>(istream &s, Vector<T> &A)
  225. {
  226.     Subscript N;
  227.     s >> N;
  228.     if ( !(N == A.n_) )
  229.     {
  230.         A.destroy();
  231.         A.initialize(N);
  232.     }
  233.     for (Subscript i=0; i<N; i++)
  234.             s >>  A[i];
  235.     return s;
  236. }
  237. //*******************[ basic matrix algorithms ]***************************
  238. template <class T>
  239. Vector<T> operator+(const Vector<T> &A, 
  240.     const Vector<T> &B)
  241. {
  242.     Subscript N = A.dim();
  243.     assert(N==B.dim());
  244.     Vector<T> tmp(N);
  245.     Subscript i;
  246.     for (i=0; i<N; i++)
  247.             tmp[i] = A[i] + B[i];
  248.     return tmp;
  249. }
  250. template <class T>
  251. Vector<T> operator-(const Vector<T> &A, 
  252.     const Vector<T> &B)
  253. {
  254.     Subscript N = A.dim();
  255.     assert(N==B.dim());
  256.     Vector<T> tmp(N);
  257.     Subscript i;
  258.     for (i=0; i<N; i++)
  259.             tmp[i] = A[i] - B[i];
  260.     return tmp;
  261. }
  262. template <class T>
  263. Vector<T> operator-(const Vector<T> &A)
  264. {
  265.     Subscript N = A.dim();
  266.     Vector<T> tmp(N);
  267.     Subscript i;
  268.     for (i=0; i<N; i++)
  269.             tmp[i] = -A[i];
  270.     return tmp;
  271. }
  272. template <class T>
  273. Vector<T> operator*(const Vector<T> &A, 
  274.     const Vector<T> &B)
  275. {
  276.     Subscript N = A.dim();
  277.     assert(N==B.dim());
  278.     Vector<T> tmp(N);
  279.     Subscript i;
  280.     for (i=0; i<N; i++)
  281.             tmp[i] = A[i] * B[i];
  282.     return tmp;
  283. }
  284. template <class T>
  285. T dot_prod(const Vector<T> &A, const Vector<T> &B)
  286. {
  287.     Subscript N = A.dim();
  288.     assert(N == B.dim());
  289.     Subscript i;
  290.     T sum = 0;
  291.     for (i=0; i<N; i++)
  292.         sum += A[i] * B[i];
  293.     return sum;
  294. }
  295. #endif
  296. // VEC_H