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 |
// $Id$ |
4129 |
19 Jan 22 |
peter |
5 |
|
4129 |
19 Jan 22 |
peter |
6 |
/* |
4129 |
19 Jan 22 |
peter |
Copyright (C) 2022 Peter Johansson |
4129 |
19 Jan 22 |
peter |
8 |
|
4129 |
19 Jan 22 |
peter |
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 |
The yat library is free software; you can redistribute it and/or |
4129 |
19 Jan 22 |
peter |
modify it under the terms of the GNU General Public License as |
4129 |
19 Jan 22 |
peter |
published by the Free Software Foundation; either version 3 of the |
4129 |
19 Jan 22 |
peter |
License, or (at your option) any later version. |
4129 |
19 Jan 22 |
peter |
15 |
|
4129 |
19 Jan 22 |
peter |
The yat library is distributed in the hope that it will be useful, |
4129 |
19 Jan 22 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
4129 |
19 Jan 22 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
4129 |
19 Jan 22 |
peter |
General Public License for more details. |
4129 |
19 Jan 22 |
peter |
20 |
|
4129 |
19 Jan 22 |
peter |
You should have received a copy of the GNU General Public License |
4129 |
19 Jan 22 |
peter |
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 |
\brief Interface to GSL matrix_view |
4129 |
19 Jan 22 |
peter |
39 |
|
4129 |
19 Jan 22 |
peter |
Class provides a way to have a mutable view into a Matrix. See |
4129 |
19 Jan 22 |
peter |
GSL documentation (gsl_matrix_view) for design details. A view |
4129 |
19 Jan 22 |
peter |
can be a view of the entire Matrix or a contiguous sub-matrix |
4129 |
19 Jan 22 |
peter |
defined by the left- and right columns as well as the upper and |
4129 |
19 Jan 22 |
peter |
lower rows. |
4129 |
19 Jan 22 |
peter |
45 |
|
4129 |
19 Jan 22 |
peter |
The semantics of the class is very much like a mutable |
4129 |
19 Jan 22 |
peter |
reference. That means that assignment implies that the underlying |
4129 |
19 Jan 22 |
peter |
data is changed and in the assignment operators and the size of |
4129 |
19 Jan 22 |
peter |
left and tight-hand-side must be the same. It is not possible to |
4129 |
19 Jan 22 |
peter |
reassign which Matrix the MatrixView views into, again similar to |
4129 |
19 Jan 22 |
peter |
how a reference cannot be reassigned to reference another object. |
4129 |
19 Jan 22 |
peter |
52 |
|
4129 |
19 Jan 22 |
peter |
\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 |
Default constructor. Constructed view behaves like viewing into |
4129 |
19 Jan 22 |
peter |
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 |
Copy constructor. To keep const correctness, the argument |
4129 |
19 Jan 22 |
peter |
cannot be const here, parallel with how one cannot create a |
4129 |
19 Jan 22 |
peter |
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 |
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 |
/** for (size_t i=0; i<matrix.rows(); ++i) |
4129 |
19 Jan 22 |
peter |
77 |
|
4129 |
19 Jan 22 |
peter |
Create view into sub-matrix into \c other. |
4129 |
19 Jan 22 |
peter |
79 |
|
4129 |
19 Jan 22 |
peter |
view(0,) will view into other(row_offset, col_offset) and have |
4129 |
19 Jan 22 |
peter |
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 |
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 |
Create a view with \c rows rows and \c cols columns. Data are |
4141 |
01 Feb 22 |
peter |
stored in row-major order such that p[1] correspond to |
4141 |
01 Feb 22 |
peter |
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 |
Create a view with \c rows rows and \c cols columns. The |
4141 |
01 Feb 22 |
peter |
physical row dimension is \c tda, i.e., the first element on |
4141 |
01 Feb 22 |
peter |
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 |
\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 |
\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 |
\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 |
Assign values in other to left-hand side. Dimensions of |
4129 |
19 Jan 22 |
peter |
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 |
Copy values in \c rhs into this. Dimensions must agree. It's |
4129 |
19 Jan 22 |
peter |
safe to call this function when data of rhs and gsl_matrix_p() |
4129 |
19 Jan 22 |
peter |
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 |
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 |
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 |
// create view of data in \c other |
4129 |
19 Jan 22 |
peter |
149 |
void copy(gsl_matrix* other); |
4129 |
19 Jan 22 |
peter |
// create view of data in \c other. Created view has dimension n1 |
4129 |
19 Jan 22 |
peter |
// 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 |
// 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 |
\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 |
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 |