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

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. //  Templated sparse vector (Fortran conventions).
  10. //  Used primarily to interface with Fortran sparse matrix libaries.
  11. //  (CANNOT BE USED AS AN STL CONTAINER.)
  12. #ifndef FSPVEC_H
  13. #define FSPVEC_H
  14. #include "tnt.h"
  15. #include "vec.h"
  16. #include <stdlib.h>
  17. #include <assert.h>
  18. #include <iostream.h>
  19. #include <strstream.h>
  20. template <class T>
  21. class Fortran_sparse_vector 
  22. {
  23.   public:
  24.     typedef Subscript   size_type;
  25.     typedef         T   value_type;
  26.     typedef         T   element_type;
  27.     typedef         T*  pointer;
  28.     typedef         T*  iterator;
  29.     typedef         T&  reference;
  30.     typedef const   T*  const_iterator;
  31.     typedef const   T&  const_reference;
  32.     Subscript lbound() const { return 1;}
  33.  
  34.   protected:
  35.     Vector<T>   val_;
  36.     Vector<Subscript> index_;
  37.     Subscript dim_;                  // prescribed dimension
  38.   public:
  39.     // size and shape information
  40.     Subscript dim() const { return dim_; }
  41.     Subscript num_nonzeros() const { return val_.dim(); }
  42.     // access
  43.     T& val(Subscript i) { return val_(i); }
  44.     const T& val(Subscript i) const { return val_(i); }
  45.     Subscript &index(Subscript i) { return index_(i); }
  46.     const Subscript &index(Subscript i) const { return index_(i); }
  47.     // constructors
  48.     Fortran_sparse_vector() : val_(), index_(), dim_(0)  {};
  49.     Fortran_sparse_vector(Subscript N, Subscript nz) : val_(nz), 
  50.             index_(nz), dim_(N)  {};
  51.     Fortran_sparse_vector(Subscript N, Subscript nz, const T *values,
  52.         const Subscript *indices): val_(nz, values), index_(nz, indices),
  53.             dim_(N) {}
  54.     Fortran_sparse_vector(const Fortran_sparse_vector<T> &S): 
  55.         val_(S.val_), index_(S.index_), dim_(S.dim_) {}
  56.     // initialize from string, e.g.
  57.     //
  58.     //  Fortran_sparse_vector<T> A(N, 2, "1.0 2.1", "1 3");
  59.     //
  60.     Fortran_sparse_vector(Subscript N, Subscript nz, char *v,
  61.         char *ind) : val_(nz, v), index_(nz, ind), dim_(N) {}
  62.     
  63.     // assignments
  64.     Fortran_sparse_vector<T> & newsize(Subscript N, Subscript nz)
  65.     {
  66.         val_.newsize(nz);
  67.         index_.newsize(nz);
  68.         dim_ = N;
  69.         return *this;
  70.     }
  71.     Fortran_sparse_vector<T> & operator=( const Fortran_sparse_vector<T> &A)
  72.     {
  73.         val_ = A.val_;
  74.         index_ = A.index_;
  75.         dim_ = A.dim_;
  76.         return *this;
  77.     }
  78.     // methods
  79.     friend istream& operator>>(istream &s, Fortran_sparse_vector<T> &A);
  80. };
  81. /* ***************************  I/O  ********************************/
  82. template <class T>
  83. ostream& operator<<(ostream &s, const Fortran_sparse_vector<T> &A)
  84. {
  85.     // output format is :   N nz val1 ind1 val2 ind2 ... 
  86.     Subscript nz=A.num_nonzeros();
  87.     s <<  A.dim() << " " << nz << endl;
  88.     for (Subscript i=1; i<=nz; i++)
  89.         s   << A.val(i) << "  " << A.index(i) << endl;
  90.     s << endl;
  91.     return s;
  92. }
  93. template <class T>
  94. istream& operator>>(istream &s, Fortran_sparse_vector<T> &A)
  95. {
  96.     // output format is :   N nz val1 ind1 val2 ind2 ... 
  97.     Subscript N;
  98.     Subscript nz;
  99.     s >> N >> nz;
  100.     A.newsize(N, nz);
  101.     for (Subscript i=1; i<=nz; i++)
  102.             s >>  A.val(i) >> A.index(i);
  103.     return s;
  104. }
  105. #endif
  106. // FSPVEC_H