Skip to content
Snippets Groups Projects
dynmatrix.hh 2.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    // vi: set et ts=4 sw=2 sts=2:
    // $Id: fmatrix.hh 6181 2010-10-13 18:53:40Z christi $
    
    #ifndef DUNE_DYNMATRIX_HH
    #define DUNE_DYNMATRIX_HH
    
    
    #include <cmath>
    #include <cstddef>
    #include <iostream>
    
    #include <dune/common/exceptions.hh>
    #include <dune/common/dynvector.hh>
    #include <dune/common/densematrix.hh>
    #include <dune/common/static_assert.hh>
    
    namespace Dune
    {
    
      /**
          @addtogroup DenseMatVec
          @{
       */
    
      /*! \file
    
    Oliver Sander's avatar
    Oliver Sander committed
       *  \brief This file implements a dense matrix with dynamic numbers of rows and columns.
    
       */
    
      template< class K > class DynamicMatrix;
    
      template< class K >
      struct DenseMatVecTraits< DynamicMatrix<K> >
      {
        typedef DynamicMatrix<K> derived_type;
    
        typedef DynamicVector<K> row_type;
    
    
        typedef row_type &row_reference;
        typedef const row_type &const_row_reference;
    
    
        typedef std::vector<K> container_type;
        typedef K value_type;
        typedef typename container_type::size_type size_type;
      };
    
      template< class K >
      struct FieldTraits< DynamicMatrix<K> >
      {
        typedef typename FieldTraits<K>::field_type field_type;
        typedef typename FieldTraits<K>::real_type real_type;
      };
    
      /** \brief Construct a matrix with a dynamic size.
       *
       * \tparam K is the field type (use float, double, complex, etc)
       */
      template<class K>
      class DynamicMatrix : public DenseMatrix< DynamicMatrix<K> >
      {
        std::vector< DynamicVector<K> > _data;
        typedef DenseMatrix< DynamicMatrix<K> > Base;
      public:
        typedef typename Base::size_type size_type;
        typedef typename Base::value_type value_type;
        typedef typename Base::row_type row_type;
    
        //===== constructors
        //! \brief Default constructor
        DynamicMatrix () {}
    
        //! \brief Constructor initializing the whole matrix with a scalar
        DynamicMatrix (size_type r, size_type c, value_type v = value_type() ) :
          _data(r, row_type(c, v) )
        {}
    
        //==== resize related methods
        void resize (size_type r, size_type c, value_type v = value_type() )
        {
    
          _data.resize(0);
    
          _data.resize(r, row_type(c, v) );
        }
    
        //===== assignment
        using Base::operator=;
    
        // make this thing a matrix
        size_type mat_rows() const { return _data.size(); }
        size_type mat_cols() const {
          assert(this->rows());
          return _data.front().size();
        }
        row_type & mat_access(size_type i) { return _data[i]; }
        const row_type & mat_access(size_type i) const { return _data[i]; }
      };
    
      /** @} end documentation */
    
    } // end namespace
    
    #endif