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

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 compressed sparse column matrix (Fortran conventions).
  10. //  Used primarily to interface with Fortran sparse matrix libaries.
  11. //  (CANNOT BE USED AS AN STL CONTAINER.)
  12. #ifndef FCSCMAT_H
  13. #define FCSCMAT_H
  14. #include <iostream.h>
  15. #include <assert.h>
  16. #include "tnt.h"
  17. #include "vec.h"
  18. template <class T>
  19. class Fortran_compressed_col_matrix 
  20. {
  21.    protected:
  22.        Vector<T>           val_;       // data values (nz_ elements)
  23.        Vector<Subscript>   rowind_;    // row_ind (nz_ elements)
  24.        Vector<Subscript>   colptr_;    // col_ptr (n_+1 elements)
  25.        int nz_;                   // number of nonzeros
  26.        Subscript m_;              // global dimensions
  27.        Subscript n_;
  28.   
  29.    public:
  30.        Fortran_compressed_col_matrix(void);
  31.        Fortran_compressed_col_matrix(const Fortran_compressed_col_matrix<T> &S);
  32.        Fortran_compressed_col_matrix(Subscript M, Subscript N, 
  33.             Subscript nz, const T  *val,  const Subscript *r, 
  34.             const Subscript *c) : val_(nz, val), rowind_(nz, r), 
  35.             colptr_(N+1, c), nz_(nz), m_(M), n_(N) {};
  36.        Fortran_compressed_col_matrix(Subscript M, Subscript N, 
  37.             Subscript nz, char *val,  char  *r, 
  38.             char *c) : val_(nz, val), rowind_(nz, r), 
  39.             colptr_(N+1, c), nz_(nz), m_(M), n_(N) {};
  40.        Fortran_compressed_col_matrix(Subscript M, Subscript N, 
  41.             Subscript nz, const T  *val, Subscript *r, Subscript *c)
  42.             : val_(nz, val), rowind_(nz, r), colptr_(N+1, c), nz_(nz), 
  43.                     m_(M), n_(N) {};
  44.     
  45.       ~Fortran_compressed_col_matrix() {};
  46.         
  47.        T &      val(Subscript i) { return val_(i); }
  48.        const T &      val(Subscript i) const { return val_(i); }
  49.        Subscript &   row_ind(Subscript i) { return rowind_(i); }
  50.        const Subscript &   row_ind(Subscript i) const { return rowind_(i); }
  51.        Subscript    col_ptr(Subscript i) { return colptr_(i);}
  52.        const Subscript    col_ptr(Subscript i) const { return colptr_(i);}
  53.        Subscript    num_cols() const { return m_;}
  54.        Subscript    num_rows() const { return n_; }
  55.        Subscript          dim(Subscript i) const 
  56.        {
  57. #ifdef TNT_BOUNDS_CHECK
  58.             assert( 1 <= i );
  59.             assert( i <= 2 );
  60. #endif
  61.             if (i==1) return m_;
  62.             else if (i==2) return m_;
  63.             else return 0;
  64.         }
  65.        Subscript          num_nonzeros() const {return nz_;};
  66.        Subscript          lbound() const {return 1;}
  67.        Fortran_compressed_col_matrix& operator=(const 
  68.             Fortran_compressed_col_matrix &C)
  69.         {
  70.             val_ = C.val_;
  71.             rowind_ = C.rowind_;
  72.             colptr_ = C.colptr_;
  73.             nz_ = C.nz_;
  74.             m_ = C.m_;
  75.             n_ = C.n_;
  76.             return *this;
  77.         }
  78.        Fortran_compressed_col_matrix& newsize(Subscript M, Subscript N, 
  79.                 Subscript nz)
  80.         {
  81.             val_.newsize(nz);
  82.             rowind_.newsize(nz);
  83.             colptr_.newsize(N+1);
  84.             return *this;
  85.         }
  86. };
  87. template <class T>
  88. ostream& operator<<(ostream &s, const Fortran_compressed_col_matrix<T> &A)
  89. {
  90.     Subscript M=A.num_rows();
  91.     Subscript N=A.num_cols();
  92.     s << M << " " << N << " " << A.num_nonzeros() <<  endl;
  93.     for (Subscript k=1; k<=N; k++)
  94.     {
  95.         Subscript start = A.col_ptr(k);
  96.         Subscript end = A.col_ptr(k+1);
  97.         for (Subscript i= start; i<end; i++)
  98.         {
  99.             s << A.row_ind(i) << " " << k << " " << A.val(i) << endl;
  100.         }
  101.     }
  102.     return s;
  103. }
  104. #endif  
  105. /* FCSCMAT_H */