yat/utility/MatrixView.h

Code
Comments
Other
Rev Date Author Line
4129 19 Jan 22 peter 1 #ifndef _theplu_yat_utility_matrix_view_
4129 19 Jan 22 peter 2 #define _theplu_yat_utility_matrix_view_
4129 19 Jan 22 peter 3
4129 19 Jan 22 peter 4 // $Id$
4129 19 Jan 22 peter 5
4129 19 Jan 22 peter 6 /*
4129 19 Jan 22 peter 7   Copyright (C) 2022 Peter Johansson
4129 19 Jan 22 peter 8
4129 19 Jan 22 peter 9   This file is part of the yat library, https://dev.thep.lu.se/yat
4129 19 Jan 22 peter 10
4129 19 Jan 22 peter 11   The yat library is free software; you can redistribute it and/or
4129 19 Jan 22 peter 12   modify it under the terms of the GNU General Public License as
4129 19 Jan 22 peter 13   published by the Free Software Foundation; either version 3 of the
4129 19 Jan 22 peter 14   License, or (at your option) any later version.
4129 19 Jan 22 peter 15
4129 19 Jan 22 peter 16   The yat library is distributed in the hope that it will be useful,
4129 19 Jan 22 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
4129 19 Jan 22 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4129 19 Jan 22 peter 19   General Public License for more details.
4129 19 Jan 22 peter 20
4129 19 Jan 22 peter 21   You should have received a copy of the GNU General Public License
4129 19 Jan 22 peter 22   along with yat. If not, see <https://www.gnu.org/licenses/>.
4129 19 Jan 22 peter 23 */
4129 19 Jan 22 peter 24
4129 19 Jan 22 peter 25 #include "config_public.h"
4129 19 Jan 22 peter 26
4129 19 Jan 22 peter 27 #include "MatrixMutable.h"
4129 19 Jan 22 peter 28
4129 19 Jan 22 peter 29 #include <gsl/gsl_matrix.h>
4129 19 Jan 22 peter 30
4129 19 Jan 22 peter 31 #include <cstddef> // size_t
4129 19 Jan 22 peter 32
4129 19 Jan 22 peter 33 namespace theplu {
4129 19 Jan 22 peter 34 namespace yat {
4129 19 Jan 22 peter 35 namespace utility {
4129 19 Jan 22 peter 36
4129 19 Jan 22 peter 37   /**
4129 19 Jan 22 peter 38      \brief Interface to GSL matrix_view
4129 19 Jan 22 peter 39
4129 19 Jan 22 peter 40      Class provides a way to have a mutable view into a Matrix. See
4129 19 Jan 22 peter 41      GSL documentation (gsl_matrix_view) for design details. A view
4129 19 Jan 22 peter 42      can be a view of the entire Matrix or a contiguous sub-matrix
4129 19 Jan 22 peter 43      defined by the left- and right columns as well as the upper and
4129 19 Jan 22 peter 44      lower rows.
4129 19 Jan 22 peter 45
4129 19 Jan 22 peter 46      The semantics of the class is very much like a mutable
4129 19 Jan 22 peter 47      reference. That means that assignment implies that the underlying
4129 19 Jan 22 peter 48      data is changed and in the assignment operators and the size of
4129 19 Jan 22 peter 49      left and tight-hand-side must be the same. It is not possible to
4129 19 Jan 22 peter 50      reassign which Matrix the MatrixView views into, again similar to
4129 19 Jan 22 peter 51      how a reference cannot be reassigned to reference another object.
4129 19 Jan 22 peter 52
4129 19 Jan 22 peter 53      \since New in yat 0.20
4129 19 Jan 22 peter 54    */
4129 19 Jan 22 peter 55   class MatrixView : public MatrixMutable
4129 19 Jan 22 peter 56   {
4129 19 Jan 22 peter 57   public:
4129 19 Jan 22 peter 58     /**
4129 19 Jan 22 peter 59        Default constructor. Constructed view behaves like viewing into
4129 19 Jan 22 peter 60        an empty Matrix.
4129 19 Jan 22 peter 61      */
4129 19 Jan 22 peter 62     MatrixView(void);
4129 19 Jan 22 peter 63
4129 19 Jan 22 peter 64     /**
4129 19 Jan 22 peter 65        Copy constructor. To keep const correctness, the argument
4129 19 Jan 22 peter 66        cannot be const here, parallel with how one cannot create a
4129 19 Jan 22 peter 67        Matrix& from a const Matrix.
4129 19 Jan 22 peter 68      */
4129 19 Jan 22 peter 69     MatrixView(MatrixView& other);
4129 19 Jan 22 peter 70
4129 19 Jan 22 peter 71     /**
4129 19 Jan 22 peter 72        Create a view into a matrix \c other.
4129 19 Jan 22 peter 73      */
4129 19 Jan 22 peter 74     explicit MatrixView(MatrixMutable& other);
4129 19 Jan 22 peter 75
4129 19 Jan 22 peter 76     /**  for (size_t i=0; i<matrix.rows(); ++i)
4129 19 Jan 22 peter 77
4129 19 Jan 22 peter 78        Create view into sub-matrix into \c other.
4129 19 Jan 22 peter 79
4129 19 Jan 22 peter 80        view(0,) will view into other(row_offset, col_offset) and have
4129 19 Jan 22 peter 81        dimension row x column.
4129 19 Jan 22 peter 82      */
4129 19 Jan 22 peter 83     MatrixView(MatrixMutable& other, size_t row_offset, size_t col_offset,
4129 19 Jan 22 peter 84                size_t rows, size_t columns);
4129 19 Jan 22 peter 85
4129 19 Jan 22 peter 86     /**
4141 01 Feb 22 peter 87        Create a view into \c m.
4141 01 Feb 22 peter 88      */
4141 01 Feb 22 peter 89     explicit MatrixView(gsl_matrix* m);
4141 01 Feb 22 peter 90
4141 01 Feb 22 peter 91     /**
4141 01 Feb 22 peter 92        Create a view with \c rows rows and \c cols columns. Data are
4141 01 Feb 22 peter 93        stored in row-major order such that p[1] correspond to
4141 01 Feb 22 peter 94        view(0,1).
4141 01 Feb 22 peter 95      */
4141 01 Feb 22 peter 96     MatrixView(double* p, size_t rows, size_t cols);
4141 01 Feb 22 peter 97
4141 01 Feb 22 peter 98     /**
4141 01 Feb 22 peter 99        Create a view with \c rows rows and \c cols columns. The
4141 01 Feb 22 peter 100        physical row dimension is \c tda, i.e., the first element on
4141 01 Feb 22 peter 101        the second row is p[tda].
4141 01 Feb 22 peter 102      */
4141 01 Feb 22 peter 103     MatrixView(double* p, size_t rows, size_t cols, size_t tda);
4141 01 Feb 22 peter 104
4141 01 Feb 22 peter 105     /**
4129 19 Jan 22 peter 106        \brief Destructor
4129 19 Jan 22 peter 107      */
4129 19 Jan 22 peter 108     ~MatrixView(void);
4129 19 Jan 22 peter 109
4129 19 Jan 22 peter 110     using MatrixMutable::operator=;
4129 19 Jan 22 peter 111
4129 19 Jan 22 peter 112     /**
4129 19 Jan 22 peter 113        \return A pointer to the internal GSL matrix
4129 19 Jan 22 peter 114      */
4129 19 Jan 22 peter 115     gsl_matrix* gsl_matrix_p(void);
4129 19 Jan 22 peter 116
4129 19 Jan 22 peter 117     /**
4129 19 Jan 22 peter 118        \return A const pointer to the internal GSL matrix
4129 19 Jan 22 peter 119      */
4129 19 Jan 22 peter 120     const gsl_matrix* gsl_matrix_p(void) const;
4129 19 Jan 22 peter 121
4129 19 Jan 22 peter 122     /**
4129 19 Jan 22 peter 123        Assign values in other to left-hand side. Dimensions of
4129 19 Jan 22 peter 124        left-hand and right-hand sides must agree.
4129 19 Jan 22 peter 125      */
4129 19 Jan 22 peter 126     MatrixView& operator=(const MatrixView& other);
4129 19 Jan 22 peter 127
4129 19 Jan 22 peter 128   protected:
4129 19 Jan 22 peter 129     /**
4129 19 Jan 22 peter 130        Copy values in \c rhs into this. Dimensions must agree. It's
4129 19 Jan 22 peter 131        safe to call this function when data of rhs and gsl_matrix_p()
4129 19 Jan 22 peter 132        overlap.
4129 19 Jan 22 peter 133      */
4129 19 Jan 22 peter 134     void copy_assign(const gsl_matrix* rhs);
4129 19 Jan 22 peter 135     using MatrixMutable::copy_assign;
4129 19 Jan 22 peter 136
4129 19 Jan 22 peter 137     /**
4129 19 Jan 22 peter 138        Copy values in \c rhs into \c this
4129 19 Jan 22 peter 139      */
4129 19 Jan 22 peter 140     void move_assign(MatrixMutable&& rhs);
4129 19 Jan 22 peter 141
4129 19 Jan 22 peter 142     /**
4129 19 Jan 22 peter 143        Same behaviour as copy_assign(const gsl_matrix*).
4129 19 Jan 22 peter 144      */
4129 19 Jan 22 peter 145     void move_assign(gsl_matrix*&& rhs);
4129 19 Jan 22 peter 146   private:
4129 19 Jan 22 peter 147     gsl_matrix_view* view_;
4129 19 Jan 22 peter 148     // create view of data in \c other
4129 19 Jan 22 peter 149     void copy(gsl_matrix* other);
4129 19 Jan 22 peter 150     // create view of data in \c other. Created view has dimension n1
4129 19 Jan 22 peter 151     // x n2 and view(0,0) points to other(k1, k2)
4129 19 Jan 22 peter 152     void copy(gsl_matrix* other, size_t k1, size_t k2, size_t n1, size_t n2);
4137 21 Jan 22 peter 153
4137 21 Jan 22 peter 154
4137 21 Jan 22 peter 155     // See VectorView::proxy for motivation.
4137 21 Jan 22 peter 156     struct proxy
4137 21 Jan 22 peter 157     {
4137 21 Jan 22 peter 158       proxy(void) = delete;
4137 21 Jan 22 peter 159       proxy(gsl_matrix_view*&& v);
4137 21 Jan 22 peter 160       gsl_matrix_view* view_;
4137 21 Jan 22 peter 161     };
4137 21 Jan 22 peter 162
4137 21 Jan 22 peter 163   public:
4137 21 Jan 22 peter 164     /**
4137 21 Jan 22 peter 165        \brief create a MatrixView from an internal proxy class.
4137 21 Jan 22 peter 166      */
4137 21 Jan 22 peter 167     MatrixView(proxy p);
4137 21 Jan 22 peter 168
4137 21 Jan 22 peter 169     /**
4137 21 Jan 22 peter 170        Conversion operator to a private proxy class.
4137 21 Jan 22 peter 171      */
4137 21 Jan 22 peter 172     operator proxy();
4129 19 Jan 22 peter 173   };
4129 19 Jan 22 peter 174
4129 19 Jan 22 peter 175 }}} // of namespace utility, yat, and theplu
4129 19 Jan 22 peter 176
4129 19 Jan 22 peter 177 #endif