Chris@49
|
1 // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2013 Conrad Sanderson
|
Chris@49
|
3 // Copyright (C) 2011 James Sanders
|
Chris@49
|
4 //
|
Chris@49
|
5 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
8
|
Chris@49
|
9
|
Chris@49
|
10 //! \addtogroup subview
|
Chris@49
|
11 //! @{
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 //! Class for storing data required to construct or apply operations to a submatrix
|
Chris@49
|
15 //! (i.e. where the submatrix starts and ends as well as a reference/pointer to the original matrix),
|
Chris@49
|
16 template<typename eT>
|
Chris@49
|
17 class subview : public Base<eT, subview<eT> >
|
Chris@49
|
18 {
|
Chris@49
|
19 public:
|
Chris@49
|
20
|
Chris@49
|
21 typedef eT elem_type;
|
Chris@49
|
22 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
23
|
Chris@49
|
24 arma_aligned const Mat<eT>& m;
|
Chris@49
|
25
|
Chris@49
|
26 static const bool is_row = false;
|
Chris@49
|
27 static const bool is_col = false;
|
Chris@49
|
28
|
Chris@49
|
29 const uword aux_row1;
|
Chris@49
|
30 const uword aux_col1;
|
Chris@49
|
31
|
Chris@49
|
32 const uword n_rows;
|
Chris@49
|
33 const uword n_cols;
|
Chris@49
|
34 const uword n_elem;
|
Chris@49
|
35
|
Chris@49
|
36 protected:
|
Chris@49
|
37
|
Chris@49
|
38 arma_inline subview(const Mat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols);
|
Chris@49
|
39
|
Chris@49
|
40
|
Chris@49
|
41 public:
|
Chris@49
|
42
|
Chris@49
|
43 inline ~subview();
|
Chris@49
|
44
|
Chris@49
|
45 inline void operator+= (const eT val);
|
Chris@49
|
46 inline void operator-= (const eT val);
|
Chris@49
|
47 inline void operator*= (const eT val);
|
Chris@49
|
48 inline void operator/= (const eT val);
|
Chris@49
|
49
|
Chris@49
|
50 // deliberately returning void
|
Chris@49
|
51 template<typename T1> inline void operator= (const Base<eT,T1>& x);
|
Chris@49
|
52 template<typename T1> inline void operator+= (const Base<eT,T1>& x);
|
Chris@49
|
53 template<typename T1> inline void operator-= (const Base<eT,T1>& x);
|
Chris@49
|
54 template<typename T1> inline void operator%= (const Base<eT,T1>& x);
|
Chris@49
|
55 template<typename T1> inline void operator/= (const Base<eT,T1>& x);
|
Chris@49
|
56
|
Chris@49
|
57 inline void operator= (const subview& x);
|
Chris@49
|
58 inline void operator+= (const subview& x);
|
Chris@49
|
59 inline void operator-= (const subview& x);
|
Chris@49
|
60 inline void operator%= (const subview& x);
|
Chris@49
|
61 inline void operator/= (const subview& x);
|
Chris@49
|
62
|
Chris@49
|
63 inline static void extract(Mat<eT>& out, const subview& in);
|
Chris@49
|
64
|
Chris@49
|
65 inline static void plus_inplace(Mat<eT>& out, const subview& in);
|
Chris@49
|
66 inline static void minus_inplace(Mat<eT>& out, const subview& in);
|
Chris@49
|
67 inline static void schur_inplace(Mat<eT>& out, const subview& in);
|
Chris@49
|
68 inline static void div_inplace(Mat<eT>& out, const subview& in);
|
Chris@49
|
69
|
Chris@49
|
70 template<typename functor> inline void transform(functor F);
|
Chris@49
|
71 template<typename functor> inline void imbue(functor F);
|
Chris@49
|
72
|
Chris@49
|
73 inline void fill(const eT val);
|
Chris@49
|
74 inline void zeros();
|
Chris@49
|
75 inline void ones();
|
Chris@49
|
76 inline void eye();
|
Chris@49
|
77
|
Chris@49
|
78 inline eT at_alt (const uword ii) const;
|
Chris@49
|
79
|
Chris@49
|
80 inline eT& operator[](const uword ii);
|
Chris@49
|
81 inline eT operator[](const uword ii) const;
|
Chris@49
|
82
|
Chris@49
|
83 inline eT& operator()(const uword ii);
|
Chris@49
|
84 inline eT operator()(const uword ii) const;
|
Chris@49
|
85
|
Chris@49
|
86 inline eT& operator()(const uword in_row, const uword in_col);
|
Chris@49
|
87 inline eT operator()(const uword in_row, const uword in_col) const;
|
Chris@49
|
88
|
Chris@49
|
89 inline eT& at(const uword in_row, const uword in_col);
|
Chris@49
|
90 inline eT at(const uword in_row, const uword in_col) const;
|
Chris@49
|
91
|
Chris@49
|
92 arma_inline eT* colptr(const uword in_col);
|
Chris@49
|
93 arma_inline const eT* colptr(const uword in_col) const;
|
Chris@49
|
94
|
Chris@49
|
95 inline bool check_overlap(const subview& x) const;
|
Chris@49
|
96
|
Chris@49
|
97 inline bool is_vec() const;
|
Chris@49
|
98
|
Chris@49
|
99 inline subview_row<eT> row(const uword row_num);
|
Chris@49
|
100 inline const subview_row<eT> row(const uword row_num) const;
|
Chris@49
|
101
|
Chris@49
|
102 inline subview_row<eT> operator()(const uword row_num, const span& col_span);
|
Chris@49
|
103 inline const subview_row<eT> operator()(const uword row_num, const span& col_span) const;
|
Chris@49
|
104
|
Chris@49
|
105 inline subview_col<eT> col(const uword col_num);
|
Chris@49
|
106 inline const subview_col<eT> col(const uword col_num) const;
|
Chris@49
|
107
|
Chris@49
|
108 inline subview_col<eT> operator()(const span& row_span, const uword col_num);
|
Chris@49
|
109 inline const subview_col<eT> operator()(const span& row_span, const uword col_num) const;
|
Chris@49
|
110
|
Chris@49
|
111 inline Col<eT> unsafe_col(const uword col_num);
|
Chris@49
|
112 inline const Col<eT> unsafe_col(const uword col_num) const;
|
Chris@49
|
113
|
Chris@49
|
114 inline subview<eT> rows(const uword in_row1, const uword in_row2);
|
Chris@49
|
115 inline const subview<eT> rows(const uword in_row1, const uword in_row2) const;
|
Chris@49
|
116
|
Chris@49
|
117 inline subview<eT> cols(const uword in_col1, const uword in_col2);
|
Chris@49
|
118 inline const subview<eT> cols(const uword in_col1, const uword in_col2) const;
|
Chris@49
|
119
|
Chris@49
|
120 inline subview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);
|
Chris@49
|
121 inline const subview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;
|
Chris@49
|
122
|
Chris@49
|
123 inline subview<eT> submat (const span& row_span, const span& col_span);
|
Chris@49
|
124 inline const subview<eT> submat (const span& row_span, const span& col_span) const;
|
Chris@49
|
125
|
Chris@49
|
126 inline subview<eT> operator()(const span& row_span, const span& col_span);
|
Chris@49
|
127 inline const subview<eT> operator()(const span& row_span, const span& col_span) const;
|
Chris@49
|
128
|
Chris@49
|
129 inline subview_each1< subview<eT>, 0 > each_col();
|
Chris@49
|
130 inline subview_each1< subview<eT>, 1 > each_row();
|
Chris@49
|
131
|
Chris@49
|
132 template<typename T1> inline subview_each2< subview<eT>, 0, T1 > each_col(const Base<uword, T1>& indices);
|
Chris@49
|
133 template<typename T1> inline subview_each2< subview<eT>, 1, T1 > each_row(const Base<uword, T1>& indices);
|
Chris@49
|
134
|
Chris@49
|
135 inline diagview<eT> diag(const sword in_id = 0);
|
Chris@49
|
136 inline const diagview<eT> diag(const sword in_id = 0) const;
|
Chris@49
|
137
|
Chris@49
|
138 inline void swap_rows(const uword in_row1, const uword in_row2);
|
Chris@49
|
139 inline void swap_cols(const uword in_col1, const uword in_col2);
|
Chris@49
|
140
|
Chris@49
|
141
|
Chris@49
|
142 // // primitive forward iterator
|
Chris@49
|
143 // class iter
|
Chris@49
|
144 // {
|
Chris@49
|
145 // public:
|
Chris@49
|
146 //
|
Chris@49
|
147 // inline iter(const subview<eT>& in_M);
|
Chris@49
|
148 //
|
Chris@49
|
149 // arma_inline eT operator* () const;
|
Chris@49
|
150 //
|
Chris@49
|
151 // inline void operator++();
|
Chris@49
|
152 // inline void operator++(int);
|
Chris@49
|
153 //
|
Chris@49
|
154 //
|
Chris@49
|
155 // private:
|
Chris@49
|
156 //
|
Chris@49
|
157 // arma_aligned const eT* mem;
|
Chris@49
|
158 //
|
Chris@49
|
159 // arma_aligned uword n_rows;
|
Chris@49
|
160 //
|
Chris@49
|
161 // arma_aligned uword row_start;
|
Chris@49
|
162 // arma_aligned uword row_end_p1;
|
Chris@49
|
163 //
|
Chris@49
|
164 // arma_aligned uword row;
|
Chris@49
|
165 // arma_aligned uword col;
|
Chris@49
|
166 // arma_aligned uword i;
|
Chris@49
|
167 // };
|
Chris@49
|
168
|
Chris@49
|
169
|
Chris@49
|
170 private:
|
Chris@49
|
171
|
Chris@49
|
172 friend class Mat<eT>;
|
Chris@49
|
173 subview();
|
Chris@49
|
174 };
|
Chris@49
|
175
|
Chris@49
|
176
|
Chris@49
|
177
|
Chris@49
|
178 template<typename eT>
|
Chris@49
|
179 class subview_col : public subview<eT>
|
Chris@49
|
180 {
|
Chris@49
|
181 public:
|
Chris@49
|
182
|
Chris@49
|
183 typedef eT elem_type;
|
Chris@49
|
184 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
185
|
Chris@49
|
186 static const bool is_row = false;
|
Chris@49
|
187 static const bool is_col = true;
|
Chris@49
|
188
|
Chris@49
|
189 const eT* colmem;
|
Chris@49
|
190
|
Chris@49
|
191 inline void operator= (const subview<eT>& x);
|
Chris@49
|
192 inline void operator= (const subview_col& x);
|
Chris@49
|
193
|
Chris@49
|
194 template<typename T1>
|
Chris@49
|
195 inline void operator= (const Base<eT,T1>& x);
|
Chris@49
|
196
|
Chris@49
|
197 arma_inline const Op<subview_col<eT>,op_htrans> t() const;
|
Chris@49
|
198 arma_inline const Op<subview_col<eT>,op_htrans> ht() const;
|
Chris@49
|
199 arma_inline const Op<subview_col<eT>,op_strans> st() const;
|
Chris@49
|
200
|
Chris@49
|
201 arma_inline eT at_alt (const uword i) const;
|
Chris@49
|
202
|
Chris@49
|
203 arma_inline eT& operator[](const uword i);
|
Chris@49
|
204 arma_inline eT operator[](const uword i) const;
|
Chris@49
|
205
|
Chris@49
|
206 inline eT& operator()(const uword i);
|
Chris@49
|
207 inline eT operator()(const uword i) const;
|
Chris@49
|
208
|
Chris@49
|
209 inline eT& operator()(const uword in_row, const uword in_col);
|
Chris@49
|
210 inline eT operator()(const uword in_row, const uword in_col) const;
|
Chris@49
|
211
|
Chris@49
|
212 inline eT& at(const uword in_row, const uword in_col);
|
Chris@49
|
213 inline eT at(const uword in_row, const uword in_col) const;
|
Chris@49
|
214
|
Chris@49
|
215 arma_inline eT* colptr(const uword in_col);
|
Chris@49
|
216 arma_inline const eT* colptr(const uword in_col) const;
|
Chris@49
|
217
|
Chris@49
|
218 inline subview_col<eT> rows(const uword in_row1, const uword in_row2);
|
Chris@49
|
219 inline const subview_col<eT> rows(const uword in_row1, const uword in_row2) const;
|
Chris@49
|
220
|
Chris@49
|
221 inline subview_col<eT> subvec(const uword in_row1, const uword in_row2);
|
Chris@49
|
222 inline const subview_col<eT> subvec(const uword in_row1, const uword in_row2) const;
|
Chris@49
|
223
|
Chris@49
|
224 // TODO: add operator()(span)
|
Chris@49
|
225
|
Chris@49
|
226 protected:
|
Chris@49
|
227
|
Chris@49
|
228 inline subview_col(const Mat<eT>& in_m, const uword in_col);
|
Chris@49
|
229 inline subview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows);
|
Chris@49
|
230
|
Chris@49
|
231
|
Chris@49
|
232 private:
|
Chris@49
|
233
|
Chris@49
|
234 friend class Mat<eT>;
|
Chris@49
|
235 friend class Col<eT>;
|
Chris@49
|
236 friend class subview<eT>;
|
Chris@49
|
237
|
Chris@49
|
238 subview_col();
|
Chris@49
|
239 };
|
Chris@49
|
240
|
Chris@49
|
241
|
Chris@49
|
242
|
Chris@49
|
243 template<typename eT>
|
Chris@49
|
244 class subview_row : public subview<eT>
|
Chris@49
|
245 {
|
Chris@49
|
246 public:
|
Chris@49
|
247
|
Chris@49
|
248 typedef eT elem_type;
|
Chris@49
|
249 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
250
|
Chris@49
|
251 static const bool is_row = true;
|
Chris@49
|
252 static const bool is_col = false;
|
Chris@49
|
253
|
Chris@49
|
254 inline void operator= (const subview<eT>& x);
|
Chris@49
|
255 inline void operator= (const subview_row& x);
|
Chris@49
|
256
|
Chris@49
|
257 template<typename T1>
|
Chris@49
|
258 inline void operator= (const Base<eT,T1>& x);
|
Chris@49
|
259
|
Chris@49
|
260 arma_inline const Op<subview_row<eT>,op_htrans> t() const;
|
Chris@49
|
261 arma_inline const Op<subview_row<eT>,op_htrans> ht() const;
|
Chris@49
|
262 arma_inline const Op<subview_row<eT>,op_strans> st() const;
|
Chris@49
|
263
|
Chris@49
|
264 inline eT at_alt (const uword i) const;
|
Chris@49
|
265
|
Chris@49
|
266 inline eT& operator[](const uword i);
|
Chris@49
|
267 inline eT operator[](const uword i) const;
|
Chris@49
|
268
|
Chris@49
|
269 inline eT& operator()(const uword i);
|
Chris@49
|
270 inline eT operator()(const uword i) const;
|
Chris@49
|
271
|
Chris@49
|
272 inline eT& operator()(const uword in_row, const uword in_col);
|
Chris@49
|
273 inline eT operator()(const uword in_row, const uword in_col) const;
|
Chris@49
|
274
|
Chris@49
|
275 inline eT& at(const uword in_row, const uword in_col);
|
Chris@49
|
276 inline eT at(const uword in_row, const uword in_col) const;
|
Chris@49
|
277
|
Chris@49
|
278 inline subview_row<eT> cols(const uword in_col1, const uword in_col2);
|
Chris@49
|
279 inline const subview_row<eT> cols(const uword in_col1, const uword in_col2) const;
|
Chris@49
|
280
|
Chris@49
|
281 inline subview_row<eT> subvec(const uword in_col1, const uword in_col2);
|
Chris@49
|
282 inline const subview_row<eT> subvec(const uword in_col1, const uword in_col2) const;
|
Chris@49
|
283
|
Chris@49
|
284 // TODO: add operator()(span)
|
Chris@49
|
285
|
Chris@49
|
286 protected:
|
Chris@49
|
287
|
Chris@49
|
288 inline subview_row(const Mat<eT>& in_m, const uword in_row);
|
Chris@49
|
289 inline subview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols);
|
Chris@49
|
290
|
Chris@49
|
291
|
Chris@49
|
292 private:
|
Chris@49
|
293
|
Chris@49
|
294 friend class Mat<eT>;
|
Chris@49
|
295 friend class Row<eT>;
|
Chris@49
|
296 friend class subview<eT>;
|
Chris@49
|
297
|
Chris@49
|
298 subview_row();
|
Chris@49
|
299 };
|
Chris@49
|
300
|
Chris@49
|
301
|
Chris@49
|
302
|
Chris@49
|
303 template<typename eT>
|
Chris@49
|
304 class subview_row_strans : public Base<eT, subview_row_strans<eT> >
|
Chris@49
|
305 {
|
Chris@49
|
306 public:
|
Chris@49
|
307
|
Chris@49
|
308 typedef eT elem_type;
|
Chris@49
|
309 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
310
|
Chris@49
|
311 static const bool is_row = false;
|
Chris@49
|
312 static const bool is_col = true;
|
Chris@49
|
313
|
Chris@49
|
314 arma_aligned const subview_row<eT>& sv_row;
|
Chris@49
|
315
|
Chris@49
|
316 const uword n_rows; // equal to n_elem
|
Chris@49
|
317 const uword n_elem;
|
Chris@49
|
318 static const uword n_cols = 1;
|
Chris@49
|
319
|
Chris@49
|
320
|
Chris@49
|
321 inline explicit subview_row_strans(const subview_row<eT>& in_sv_row);
|
Chris@49
|
322
|
Chris@49
|
323 inline void extract(Mat<eT>& out) const;
|
Chris@49
|
324
|
Chris@49
|
325 inline eT at_alt (const uword i) const;
|
Chris@49
|
326
|
Chris@49
|
327 inline eT operator[](const uword i) const;
|
Chris@49
|
328 inline eT operator()(const uword i) const;
|
Chris@49
|
329
|
Chris@49
|
330 inline eT operator()(const uword in_row, const uword in_col) const;
|
Chris@49
|
331 inline eT at(const uword in_row, const uword in_col) const;
|
Chris@49
|
332 };
|
Chris@49
|
333
|
Chris@49
|
334
|
Chris@49
|
335
|
Chris@49
|
336 template<typename eT>
|
Chris@49
|
337 class subview_row_htrans : public Base<eT, subview_row_htrans<eT> >
|
Chris@49
|
338 {
|
Chris@49
|
339 public:
|
Chris@49
|
340
|
Chris@49
|
341 typedef eT elem_type;
|
Chris@49
|
342 typedef typename get_pod_type<elem_type>::result pod_type;
|
Chris@49
|
343
|
Chris@49
|
344 static const bool is_row = false;
|
Chris@49
|
345 static const bool is_col = true;
|
Chris@49
|
346
|
Chris@49
|
347 arma_aligned const subview_row<eT>& sv_row;
|
Chris@49
|
348
|
Chris@49
|
349 const uword n_rows; // equal to n_elem
|
Chris@49
|
350 const uword n_elem;
|
Chris@49
|
351 static const uword n_cols = 1;
|
Chris@49
|
352
|
Chris@49
|
353
|
Chris@49
|
354 inline explicit subview_row_htrans(const subview_row<eT>& in_sv_row);
|
Chris@49
|
355
|
Chris@49
|
356 inline void extract(Mat<eT>& out) const;
|
Chris@49
|
357
|
Chris@49
|
358 inline eT at_alt (const uword i) const;
|
Chris@49
|
359
|
Chris@49
|
360 inline eT operator[](const uword i) const;
|
Chris@49
|
361 inline eT operator()(const uword i) const;
|
Chris@49
|
362
|
Chris@49
|
363 inline eT operator()(const uword in_row, const uword in_col) const;
|
Chris@49
|
364 inline eT at(const uword in_row, const uword in_col) const;
|
Chris@49
|
365 };
|
Chris@49
|
366
|
Chris@49
|
367
|
Chris@49
|
368
|
Chris@49
|
369 //! @}
|