Chris@102: // Copyright (c) 2012 Oswin Krause Chris@102: // Copyright (c) 2013 Joaquim Duran Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. (See Chris@102: // accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: Chris@102: #ifndef BOOST_UBLAS_MATRIX_VECTOR_HPP Chris@102: #define BOOST_UBLAS_MATRIX_VECTOR_HPP Chris@102: Chris@102: #include //for matrix_row, matrix_column and matrix_expression Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { namespace numeric { namespace ublas { Chris@102: Chris@102: namespace detail{ Chris@102: Chris@102: /** \brief Iterator used in the represention of a matrix as a vector of rows or columns Chris@102: * Chris@102: * Iterator used in the represention of a matrix as a vector of rows/columns. It refers Chris@102: * to the i-th element of the matrix, a column or a row depending of Reference type. Chris@102: * Chris@102: * The type of Reference should provide a constructor Reference(matrix, i) Chris@102: * Chris@102: * This iterator is invalidated when the underlying matrix is resized. Chris@102: * Chris@102: * \tparameter Matrix type of matrix that is represented as a vector of row/column Chris@102: * \tparameter Reference Matrix row or matrix column type. Chris@102: */ Chris@102: template Chris@102: class matrix_vector_iterator: public boost::iterator_facade< Chris@102: matrix_vector_iterator, Chris@102: typename vector_temporary_traits::type, Chris@102: boost::random_access_traversal_tag, Chris@102: Reference Chris@102: >{ Chris@102: public: Chris@102: matrix_vector_iterator(){} Chris@102: Chris@102: ///\brief constructs a matrix_vector_iterator as pointing to the i-th proxy Chris@102: matrix_vector_iterator(Matrix& matrix, std::size_t position) Chris@102: : matrix_(&matrix),position_(position) {} Chris@102: Chris@102: template Chris@102: matrix_vector_iterator(matrix_vector_iterator const& other) Chris@102: : matrix_(other.matrix_),position_(other.position_) {} Chris@102: Chris@102: private: Chris@102: friend class boost::iterator_core_access; Chris@102: template friend class matrix_vector_iterator; Chris@102: Chris@102: void increment() { Chris@102: ++position_; Chris@102: } Chris@102: void decrement() { Chris@102: --position_; Chris@102: } Chris@102: Chris@102: void advance(std::ptrdiff_t n){ Chris@102: position_ += n; Chris@102: } Chris@102: Chris@102: template Chris@102: std::ptrdiff_t distance_to(matrix_vector_iterator const& other) const{ Chris@102: BOOST_UBLAS_CHECK (matrix_ == other.matrix_, external_logic ()); Chris@102: return (std::ptrdiff_t)other.position_ - (std::ptrdiff_t)position_; Chris@102: } Chris@102: Chris@102: template Chris@102: bool equal(matrix_vector_iterator const& other) const{ Chris@102: BOOST_UBLAS_CHECK (matrix_ == other.matrix_, external_logic ()); Chris@102: return (position_ == other.position_); Chris@102: } Chris@102: Reference dereference() const { Chris@102: return Reference(*matrix_,position_); Chris@102: } Chris@102: Chris@102: Matrix* matrix_;//no matrix_closure here to ensure easy usage Chris@102: std::size_t position_; Chris@102: }; Chris@102: Chris@102: } Chris@102: Chris@102: /** \brief Represents a \c Matrix as a vector of rows. Chris@102: * Chris@102: * Implements an interface to Matrix that the underlaying matrix is represented as a Chris@102: * vector of rows. Chris@102: * Chris@102: * The vector could be resized which causes the resize of the number of rows of Chris@102: * the underlaying matrix. Chris@102: */ Chris@102: template Chris@102: class matrix_row_vector { Chris@102: public: Chris@102: typedef ublas::matrix_row value_type; Chris@102: typedef ublas::matrix_row reference; Chris@102: typedef ublas::matrix_row const_reference; Chris@102: Chris@102: typedef ublas::detail::matrix_vector_iterator > iterator; Chris@102: typedef ublas::detail::matrix_vector_iterator const> const_iterator; Chris@102: typedef boost::reverse_iterator reverse_iterator; Chris@102: typedef boost::reverse_iterator const_reverse_iterator; Chris@102: Chris@102: typedef typename boost::iterator_difference::type difference_type; Chris@102: typedef typename Matrix::size_type size_type; Chris@102: Chris@102: matrix_row_vector(Matrix& matrix) : Chris@102: matrix_(matrix) { Chris@102: } Chris@102: Chris@102: Chris@102: iterator begin(){ Chris@102: return iterator(matrix_, 0); Chris@102: } Chris@102: Chris@102: const_iterator begin() const { Chris@102: return const_iterator(matrix_, 0); Chris@102: } Chris@102: Chris@102: const_iterator cbegin() const { Chris@102: return begin(); Chris@102: } Chris@102: Chris@102: iterator end() { Chris@102: return iterator(matrix_, matrix_.size1()); Chris@102: } Chris@102: Chris@102: const_iterator end() const { Chris@102: return const_iterator(matrix_, matrix_.size1()); Chris@102: } Chris@102: Chris@102: const_iterator cend() const { Chris@102: return end(); Chris@102: } Chris@102: Chris@102: reverse_iterator rbegin() { Chris@102: return reverse_iterator(end()); Chris@102: } Chris@102: Chris@102: const_reverse_iterator rbegin() const { Chris@102: return const_reverse_iterator(end()); Chris@102: } Chris@102: Chris@102: const_reverse_iterator crbegin() const { Chris@102: return rbegin(); Chris@102: } Chris@102: Chris@102: reverse_iterator rend() { Chris@102: return reverse_iterator(begin()); Chris@102: } Chris@102: Chris@102: const_reverse_iterator rend() const { Chris@102: return const_reverse_iterator(begin()); Chris@102: } Chris@102: Chris@102: const_reverse_iterator crend() const { Chris@102: return end(); Chris@102: } Chris@102: Chris@102: value_type operator()(difference_type index) const { Chris@102: return value_type(matrix_, index); Chris@102: } Chris@102: Chris@102: reference operator[](difference_type index){ Chris@102: return reference(matrix_, index); Chris@102: } Chris@102: Chris@102: const_reference operator[](difference_type index) const { Chris@102: return const_reference(matrix_, index); Chris@102: } Chris@102: Chris@102: size_type size() const { Chris@102: return matrix_.size1(); Chris@102: } Chris@102: Chris@102: void resize(size_type size, bool preserve = true) { Chris@102: matrix_.resize(size, matrix_.size2(), preserve); Chris@102: } Chris@102: Chris@102: private: Chris@102: Matrix& matrix_; Chris@102: }; Chris@102: Chris@102: Chris@102: /** \brief Convenience function to create \c matrix_row_vector. Chris@102: * Chris@102: * Function to create \c matrix_row_vector objects. Chris@102: * \param matrix the \c matrix_expression that generates the matrix that \c matrix_row_vector is referring. Chris@102: * \return Created \c matrix_row_vector object. Chris@102: * Chris@102: * \tparam Matrix the type of matrix that \c matrix_row_vector is referring. Chris@102: */ Chris@102: template Chris@102: matrix_row_vector make_row_vector(matrix_expression& matrix){ Chris@102: return matrix_row_vector(matrix()); Chris@102: } Chris@102: Chris@102: Chris@102: /** \brief Convenience function to create \c matrix_row_vector. Chris@102: * Chris@102: * Function to create \c matrix_row_vector objects. Chris@102: * \param matrix the \c matrix_expression that generates the matrix that \c matrix_row_vector is referring. Chris@102: * \return Created \c matrix_row_vector object. Chris@102: * Chris@102: * \tparam Matrix the type of matrix that \c matrix_row_vector is referring. Chris@102: */ Chris@102: template Chris@102: matrix_row_vector make_row_vector(matrix_expression const& matrix){ Chris@102: return matrix_row_vector(matrix()); Chris@102: } Chris@102: Chris@102: Chris@102: /** \brief Represents a \c Matrix as a vector of columns. Chris@102: * Chris@102: * Implements an interface to Matrix that the underlaying matrix is represented as a Chris@102: * vector of columns. Chris@102: * Chris@102: * The vector could be resized which causes the resize of the number of columns of Chris@102: * the underlaying matrix. Chris@102: */ Chris@102: template Chris@102: class matrix_column_vector Chris@102: { Chris@102: public: Chris@102: typedef ublas::matrix_column value_type; Chris@102: typedef ublas::matrix_column reference; Chris@102: typedef const ublas::matrix_column const_reference; Chris@102: Chris@102: typedef ublas::detail::matrix_vector_iterator > iterator; Chris@102: typedef ublas::detail::matrix_vector_iterator const > const_iterator; Chris@102: typedef boost::reverse_iterator reverse_iterator; Chris@102: typedef boost::reverse_iterator const_reverse_iterator; Chris@102: Chris@102: typedef typename boost::iterator_difference::type difference_type; Chris@102: typedef typename Matrix::size_type size_type; Chris@102: Chris@102: matrix_column_vector(Matrix& matrix) : Chris@102: matrix_(matrix){ Chris@102: } Chris@102: Chris@102: iterator begin() { Chris@102: return iterator(matrix_, 0); Chris@102: } Chris@102: Chris@102: const_iterator begin() const { Chris@102: return const_iterator(matrix_, 0); Chris@102: } Chris@102: Chris@102: const_iterator cbegin() const { Chris@102: return begin(); Chris@102: } Chris@102: Chris@102: iterator end() { Chris@102: return iterator(matrix_, matrix_.size2()); Chris@102: } Chris@102: Chris@102: const_iterator end() const { Chris@102: return const_iterator(matrix_, matrix_.size2()); Chris@102: } Chris@102: Chris@102: const_iterator cend() const { Chris@102: return end(); Chris@102: } Chris@102: Chris@102: reverse_iterator rbegin() { Chris@102: return reverse_iterator(end()); Chris@102: } Chris@102: Chris@102: const_reverse_iterator rbegin() const { Chris@102: return const_reverse_iterator(end()); Chris@102: } Chris@102: Chris@102: const_reverse_iterator crbegin() const { Chris@102: return rbegin(); Chris@102: } Chris@102: Chris@102: reverse_iterator rend() { Chris@102: return reverse_iterator(begin()); Chris@102: } Chris@102: Chris@102: const_reverse_iterator rend() const { Chris@102: return const_reverse_iterator(begin()); Chris@102: } Chris@102: Chris@102: const_reverse_iterator crend() const { Chris@102: return rend(); Chris@102: } Chris@102: Chris@102: value_type operator()(difference_type index) const { Chris@102: return value_type(matrix_, index); Chris@102: } Chris@102: Chris@102: reference operator[](difference_type index) { Chris@102: return reference(matrix_, index); Chris@102: } Chris@102: Chris@102: const_reference operator[](difference_type index) const { Chris@102: return const_reference(matrix_, index); Chris@102: } Chris@102: Chris@102: size_type size() const { Chris@102: return matrix_.size2(); Chris@102: } Chris@102: Chris@102: void resize(size_type size, bool preserve = true) { Chris@102: matrix_.resize(matrix_.size1(), size, preserve); Chris@102: } Chris@102: Chris@102: private: Chris@102: Matrix& matrix_; Chris@102: }; Chris@102: Chris@102: Chris@102: /** \brief Convenience function to create \c matrix_column_vector. Chris@102: * Chris@102: * Function to create \c matrix_column_vector objects. Chris@102: * \param matrix the \c matrix_expression that generates the matrix that \c matrix_column_vector is referring. Chris@102: * \return Created \c matrix_column_vector object. Chris@102: * Chris@102: * \tparam Matrix the type of matrix that \c matrix_column_vector is referring. Chris@102: */ Chris@102: template Chris@102: matrix_column_vector make_column_vector(matrix_expression& matrix){ Chris@102: return matrix_column_vector(matrix()); Chris@102: } Chris@102: Chris@102: Chris@102: /** \brief Convenience function to create \c matrix_column_vector. Chris@102: * Chris@102: * Function to create \c matrix_column_vector objects. Chris@102: * \param matrix the \c matrix_expression that generates the matrix that \c matrix_column_vector is referring. Chris@102: * \return Created \c matrix_column_vector object. Chris@102: * Chris@102: * \tparam Matrix the type of matrix that \c matrix_column_vector is referring. Chris@102: */ Chris@102: template Chris@102: matrix_column_vector make_column_vector(matrix_expression const& matrix){ Chris@102: return matrix_column_vector(matrix()); Chris@102: } Chris@102: Chris@102: }}} Chris@102: Chris@102: #endif