Chris@49
|
1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2012 Conrad Sanderson
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup subview_field
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 template<typename oT>
|
Chris@49
|
14 inline
|
Chris@49
|
15 subview_field<oT>::~subview_field()
|
Chris@49
|
16 {
|
Chris@49
|
17 arma_extra_debug_sigprint();
|
Chris@49
|
18 }
|
Chris@49
|
19
|
Chris@49
|
20
|
Chris@49
|
21
|
Chris@49
|
22 template<typename oT>
|
Chris@49
|
23 arma_inline
|
Chris@49
|
24 subview_field<oT>::subview_field
|
Chris@49
|
25 (
|
Chris@49
|
26 const field<oT>& in_f,
|
Chris@49
|
27 const uword in_row1,
|
Chris@49
|
28 const uword in_col1,
|
Chris@49
|
29 const uword in_n_rows,
|
Chris@49
|
30 const uword in_n_cols
|
Chris@49
|
31 )
|
Chris@49
|
32 : f(in_f)
|
Chris@49
|
33 , aux_row1(in_row1)
|
Chris@49
|
34 , aux_col1(in_col1)
|
Chris@49
|
35 , n_rows(in_n_rows)
|
Chris@49
|
36 , n_cols(in_n_cols)
|
Chris@49
|
37 , n_elem(in_n_rows*in_n_cols)
|
Chris@49
|
38 {
|
Chris@49
|
39 arma_extra_debug_sigprint();
|
Chris@49
|
40 }
|
Chris@49
|
41
|
Chris@49
|
42
|
Chris@49
|
43
|
Chris@49
|
44 template<typename oT>
|
Chris@49
|
45 inline
|
Chris@49
|
46 void
|
Chris@49
|
47 subview_field<oT>::operator= (const field<oT>& x)
|
Chris@49
|
48 {
|
Chris@49
|
49 arma_extra_debug_sigprint();
|
Chris@49
|
50
|
Chris@49
|
51 subview_field<oT>& t = *this;
|
Chris@49
|
52
|
Chris@49
|
53 arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols), "incompatible field dimensions");
|
Chris@49
|
54
|
Chris@49
|
55 for(uword col=0; col<t.n_cols; ++col)
|
Chris@49
|
56 {
|
Chris@49
|
57 for(uword row=0; row<t.n_rows; ++row)
|
Chris@49
|
58 {
|
Chris@49
|
59 t.at(row,col) = x.at(row,col);
|
Chris@49
|
60 }
|
Chris@49
|
61 }
|
Chris@49
|
62 }
|
Chris@49
|
63
|
Chris@49
|
64
|
Chris@49
|
65
|
Chris@49
|
66 //! x.subfield(...) = y.subfield(...)
|
Chris@49
|
67 template<typename oT>
|
Chris@49
|
68 inline
|
Chris@49
|
69 void
|
Chris@49
|
70 subview_field<oT>::operator= (const subview_field<oT>& x_in)
|
Chris@49
|
71 {
|
Chris@49
|
72 arma_extra_debug_sigprint();
|
Chris@49
|
73
|
Chris@49
|
74 const bool overlap = check_overlap(x_in);
|
Chris@49
|
75
|
Chris@49
|
76 field<oT>* tmp_field = overlap ? new field<oT>(x_in.f) : 0;
|
Chris@49
|
77 const subview_field<oT>* tmp_subview = overlap ? new subview_field<oT>(*tmp_field, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
|
Chris@49
|
78 const subview_field<oT>& x = overlap ? (*tmp_subview) : x_in;
|
Chris@49
|
79
|
Chris@49
|
80 subview_field<oT>& t = *this;
|
Chris@49
|
81
|
Chris@49
|
82 arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols), "incompatible field dimensions");
|
Chris@49
|
83
|
Chris@49
|
84 for(uword col=0; col<t.n_cols; ++col)
|
Chris@49
|
85 {
|
Chris@49
|
86 for(uword row=0; row<t.n_rows; ++row)
|
Chris@49
|
87 {
|
Chris@49
|
88 t.at(row,col) = x.at(row,col);
|
Chris@49
|
89 }
|
Chris@49
|
90 }
|
Chris@49
|
91
|
Chris@49
|
92 if(overlap)
|
Chris@49
|
93 {
|
Chris@49
|
94 delete tmp_subview;
|
Chris@49
|
95 delete tmp_field;
|
Chris@49
|
96 }
|
Chris@49
|
97 }
|
Chris@49
|
98
|
Chris@49
|
99
|
Chris@49
|
100
|
Chris@49
|
101 template<typename oT>
|
Chris@49
|
102 arma_inline
|
Chris@49
|
103 oT&
|
Chris@49
|
104 subview_field<oT>::operator[](const uword i)
|
Chris@49
|
105 {
|
Chris@49
|
106 const uword in_col = i / n_rows;
|
Chris@49
|
107 const uword in_row = i % n_rows;
|
Chris@49
|
108
|
Chris@49
|
109 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
|
Chris@49
|
110
|
Chris@49
|
111 return *((const_cast< field<oT>& >(f)).mem[index]);
|
Chris@49
|
112 }
|
Chris@49
|
113
|
Chris@49
|
114
|
Chris@49
|
115
|
Chris@49
|
116 template<typename oT>
|
Chris@49
|
117 arma_inline
|
Chris@49
|
118 const oT&
|
Chris@49
|
119 subview_field<oT>::operator[](const uword i) const
|
Chris@49
|
120 {
|
Chris@49
|
121 const uword in_col = i / n_rows;
|
Chris@49
|
122 const uword in_row = i % n_rows;
|
Chris@49
|
123
|
Chris@49
|
124 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
|
Chris@49
|
125
|
Chris@49
|
126 return *(f.mem[index]);
|
Chris@49
|
127 }
|
Chris@49
|
128
|
Chris@49
|
129
|
Chris@49
|
130
|
Chris@49
|
131 template<typename oT>
|
Chris@49
|
132 arma_inline
|
Chris@49
|
133 oT&
|
Chris@49
|
134 subview_field<oT>::operator()(const uword i)
|
Chris@49
|
135 {
|
Chris@49
|
136 arma_debug_check( (i >= n_elem), "subview_field::operator(): index out of bounds");
|
Chris@49
|
137
|
Chris@49
|
138 const uword in_col = i / n_rows;
|
Chris@49
|
139 const uword in_row = i % n_rows;
|
Chris@49
|
140
|
Chris@49
|
141 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
|
Chris@49
|
142
|
Chris@49
|
143 return *((const_cast< field<oT>& >(f)).mem[index]);
|
Chris@49
|
144 }
|
Chris@49
|
145
|
Chris@49
|
146
|
Chris@49
|
147
|
Chris@49
|
148 template<typename oT>
|
Chris@49
|
149 arma_inline
|
Chris@49
|
150 const oT&
|
Chris@49
|
151 subview_field<oT>::operator()(const uword i) const
|
Chris@49
|
152 {
|
Chris@49
|
153 arma_debug_check( (i >= n_elem), "subview_field::operator(): index out of bounds");
|
Chris@49
|
154
|
Chris@49
|
155 const uword in_col = i / n_rows;
|
Chris@49
|
156 const uword in_row = i % n_rows;
|
Chris@49
|
157
|
Chris@49
|
158 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
|
Chris@49
|
159
|
Chris@49
|
160 return *(f.mem[index]);
|
Chris@49
|
161 }
|
Chris@49
|
162
|
Chris@49
|
163
|
Chris@49
|
164
|
Chris@49
|
165 template<typename oT>
|
Chris@49
|
166 arma_inline
|
Chris@49
|
167 oT&
|
Chris@49
|
168 subview_field<oT>::operator()(const uword in_row, const uword in_col)
|
Chris@49
|
169 {
|
Chris@49
|
170 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview_field::operator(): index out of bounds");
|
Chris@49
|
171
|
Chris@49
|
172 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
|
Chris@49
|
173
|
Chris@49
|
174 return *((const_cast< field<oT>& >(f)).mem[index]);
|
Chris@49
|
175 }
|
Chris@49
|
176
|
Chris@49
|
177
|
Chris@49
|
178
|
Chris@49
|
179 template<typename oT>
|
Chris@49
|
180 arma_inline
|
Chris@49
|
181 const oT&
|
Chris@49
|
182 subview_field<oT>::operator()(const uword in_row, const uword in_col) const
|
Chris@49
|
183 {
|
Chris@49
|
184 arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview_field::operator(): index out of bounds");
|
Chris@49
|
185
|
Chris@49
|
186 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
|
Chris@49
|
187
|
Chris@49
|
188 return *(f.mem[index]);
|
Chris@49
|
189 }
|
Chris@49
|
190
|
Chris@49
|
191
|
Chris@49
|
192
|
Chris@49
|
193 template<typename oT>
|
Chris@49
|
194 arma_inline
|
Chris@49
|
195 oT&
|
Chris@49
|
196 subview_field<oT>::at(const uword in_row, const uword in_col)
|
Chris@49
|
197 {
|
Chris@49
|
198 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
|
Chris@49
|
199
|
Chris@49
|
200 return *((const_cast< field<oT>& >(f)).mem[index]);
|
Chris@49
|
201 }
|
Chris@49
|
202
|
Chris@49
|
203
|
Chris@49
|
204
|
Chris@49
|
205 template<typename oT>
|
Chris@49
|
206 arma_inline
|
Chris@49
|
207 const oT&
|
Chris@49
|
208 subview_field<oT>::at(const uword in_row, const uword in_col) const
|
Chris@49
|
209 {
|
Chris@49
|
210 //arma_extra_debug_sigprint();
|
Chris@49
|
211
|
Chris@49
|
212 const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
|
Chris@49
|
213
|
Chris@49
|
214 return *(f.mem[index]);
|
Chris@49
|
215 }
|
Chris@49
|
216
|
Chris@49
|
217
|
Chris@49
|
218
|
Chris@49
|
219 template<typename oT>
|
Chris@49
|
220 inline
|
Chris@49
|
221 bool
|
Chris@49
|
222 subview_field<oT>::check_overlap(const subview_field<oT>& x) const
|
Chris@49
|
223 {
|
Chris@49
|
224 const subview_field<oT>& t = *this;
|
Chris@49
|
225
|
Chris@49
|
226 if(&t.f != &x.f)
|
Chris@49
|
227 {
|
Chris@49
|
228 return false;
|
Chris@49
|
229 }
|
Chris@49
|
230 else
|
Chris@49
|
231 {
|
Chris@49
|
232 if( (t.n_elem == 0) || (x.n_elem == 0) )
|
Chris@49
|
233 {
|
Chris@49
|
234 return false;
|
Chris@49
|
235 }
|
Chris@49
|
236 else
|
Chris@49
|
237 {
|
Chris@49
|
238 const uword t_row_start = t.aux_row1;
|
Chris@49
|
239 const uword t_row_end_p1 = t_row_start + t.n_rows;
|
Chris@49
|
240
|
Chris@49
|
241 const uword t_col_start = t.aux_col1;
|
Chris@49
|
242 const uword t_col_end_p1 = t_col_start + t.n_cols;
|
Chris@49
|
243
|
Chris@49
|
244
|
Chris@49
|
245 const uword x_row_start = x.aux_row1;
|
Chris@49
|
246 const uword x_row_end_p1 = x_row_start + x.n_rows;
|
Chris@49
|
247
|
Chris@49
|
248 const uword x_col_start = x.aux_col1;
|
Chris@49
|
249 const uword x_col_end_p1 = x_col_start + x.n_cols;
|
Chris@49
|
250
|
Chris@49
|
251
|
Chris@49
|
252 const bool outside_rows = ( (x_row_start >= t_row_end_p1) || (t_row_start >= x_row_end_p1) );
|
Chris@49
|
253 const bool outside_cols = ( (x_col_start >= t_col_end_p1) || (t_col_start >= x_col_end_p1) );
|
Chris@49
|
254
|
Chris@49
|
255 return ( (outside_rows == false) && (outside_cols == false) );
|
Chris@49
|
256 }
|
Chris@49
|
257 }
|
Chris@49
|
258 }
|
Chris@49
|
259
|
Chris@49
|
260
|
Chris@49
|
261
|
Chris@49
|
262 //! X = Y.subfield(...)
|
Chris@49
|
263 template<typename oT>
|
Chris@49
|
264 inline
|
Chris@49
|
265 void
|
Chris@49
|
266 subview_field<oT>::extract(field<oT>& actual_out, const subview_field<oT>& in)
|
Chris@49
|
267 {
|
Chris@49
|
268 arma_extra_debug_sigprint();
|
Chris@49
|
269
|
Chris@49
|
270 //
|
Chris@49
|
271 const bool alias = (&actual_out == &in.f);
|
Chris@49
|
272
|
Chris@49
|
273 field<oT>* tmp = (alias) ? new field<oT> : 0;
|
Chris@49
|
274 field<oT>& out = (alias) ? (*tmp) : actual_out;
|
Chris@49
|
275
|
Chris@49
|
276 //
|
Chris@49
|
277
|
Chris@49
|
278 const uword n_rows = in.n_rows;
|
Chris@49
|
279 const uword n_cols = in.n_cols;
|
Chris@49
|
280
|
Chris@49
|
281 out.set_size(n_rows, n_cols);
|
Chris@49
|
282
|
Chris@49
|
283 arma_extra_debug_print(arma_boost::format("out.n_rows = %d out.n_cols = %d in.m.n_rows = %d in.m.n_cols = %d") % out.n_rows % out.n_cols % in.f.n_rows % in.f.n_cols );
|
Chris@49
|
284
|
Chris@49
|
285 for(uword col = 0; col<n_cols; ++col)
|
Chris@49
|
286 {
|
Chris@49
|
287 for(uword row = 0; row<n_rows; ++row)
|
Chris@49
|
288 {
|
Chris@49
|
289 out.at(row,col) = in.at(row,col);
|
Chris@49
|
290 }
|
Chris@49
|
291 }
|
Chris@49
|
292
|
Chris@49
|
293
|
Chris@49
|
294 if(alias)
|
Chris@49
|
295 {
|
Chris@49
|
296 actual_out = out;
|
Chris@49
|
297 delete tmp;
|
Chris@49
|
298 }
|
Chris@49
|
299
|
Chris@49
|
300 }
|
Chris@49
|
301
|
Chris@49
|
302
|
Chris@49
|
303
|
Chris@49
|
304 //! @}
|