Mercurial > hg > segmenter-vamp-plugin
comparison armadillo-2.4.4/include/armadillo_bits/Cube_bones.hpp @ 0:8b6102e2a9b0
Armadillo Library
author | maxzanoni76 <max.zanoni@eecs.qmul.ac.uk> |
---|---|
date | Wed, 11 Apr 2012 09:27:06 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:8b6102e2a9b0 |
---|---|
1 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au) | |
2 // Copyright (C) 2008-2011 Conrad Sanderson | |
3 // | |
4 // This file is part of the Armadillo C++ library. | |
5 // It is provided without any warranty of fitness | |
6 // for any purpose. You can redistribute this file | |
7 // and/or modify it under the terms of the GNU | |
8 // Lesser General Public License (LGPL) as published | |
9 // by the Free Software Foundation, either version 3 | |
10 // of the License or (at your option) any later version. | |
11 // (see http://www.opensource.org/licenses for more info) | |
12 | |
13 | |
14 //! \addtogroup Cube | |
15 //! @{ | |
16 | |
17 | |
18 | |
19 struct Cube_prealloc | |
20 { | |
21 static const uword mat_ptrs_size = 4; | |
22 static const uword mem_n_elem = 64; | |
23 }; | |
24 | |
25 | |
26 | |
27 //! Dense cube class | |
28 | |
29 template<typename eT> | |
30 class Cube : public BaseCube< eT, Cube<eT> > | |
31 { | |
32 public: | |
33 | |
34 typedef eT elem_type; //!< the type of elements stored in the cube | |
35 typedef typename get_pod_type<eT>::result pod_type; //!< if eT is non-complex, pod_type is same as eT. otherwise, pod_type is the underlying type used by std::complex | |
36 | |
37 const uword n_rows; //!< number of rows in each slice (read-only) | |
38 const uword n_cols; //!< number of columns in each slice (read-only) | |
39 const uword n_elem_slice; //!< number of elements in each slice (read-only) | |
40 const uword n_slices; //!< number of slices in the cube (read-only) | |
41 const uword n_elem; //!< number of elements in the cube (read-only) | |
42 const uword mem_state; | |
43 | |
44 // mem_state = 0: normal cube that can be resized; | |
45 // mem_state = 1: use auxiliary memory until change in the number of elements is requested; | |
46 // mem_state = 2: use auxiliary memory and don't allow the number of elements to be changed; | |
47 // mem_state = 3: fixed size (e.g. via template based size specification). | |
48 | |
49 | |
50 arma_aligned const Mat<eT>** const mat_ptrs; //!< pointer to an array containing pointers to Mat instances (one for each slice) | |
51 arma_aligned const eT* const mem; //!< pointer to the memory used by the cube (memory is read-only) | |
52 | |
53 protected: | |
54 arma_aligned Mat<eT>* mat_ptrs_local[ Cube_prealloc::mat_ptrs_size ]; | |
55 arma_aligned eT mem_local[ Cube_prealloc::mem_n_elem ]; | |
56 | |
57 | |
58 public: | |
59 | |
60 inline ~Cube(); | |
61 inline Cube(); | |
62 | |
63 inline Cube(const uword in_rows, const uword in_cols, const uword in_slices); | |
64 | |
65 inline Cube( eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices, const bool copy_aux_mem = true, const bool strict = true); | |
66 inline Cube(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices); | |
67 | |
68 arma_inline const Cube& operator=(const eT val); | |
69 arma_inline const Cube& operator+=(const eT val); | |
70 arma_inline const Cube& operator-=(const eT val); | |
71 arma_inline const Cube& operator*=(const eT val); | |
72 arma_inline const Cube& operator/=(const eT val); | |
73 | |
74 inline Cube(const Cube& m); | |
75 inline const Cube& operator=(const Cube& m); | |
76 inline const Cube& operator+=(const Cube& m); | |
77 inline const Cube& operator-=(const Cube& m); | |
78 inline const Cube& operator%=(const Cube& m); | |
79 inline const Cube& operator/=(const Cube& m); | |
80 | |
81 template<typename T1, typename T2> | |
82 inline explicit Cube(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B); | |
83 | |
84 inline Cube(const subview_cube<eT>& X); | |
85 inline const Cube& operator=(const subview_cube<eT>& X); | |
86 inline const Cube& operator+=(const subview_cube<eT>& X); | |
87 inline const Cube& operator-=(const subview_cube<eT>& X); | |
88 inline const Cube& operator%=(const subview_cube<eT>& X); | |
89 inline const Cube& operator/=(const subview_cube<eT>& X); | |
90 | |
91 arma_inline Mat<eT>& slice(const uword in_slice); | |
92 arma_inline const Mat<eT>& slice(const uword in_slice) const; | |
93 | |
94 arma_inline subview_cube<eT> slices(const uword in_slice1, const uword in_slice2); | |
95 arma_inline const subview_cube<eT> slices(const uword in_slice1, const uword in_slice2) const; | |
96 | |
97 arma_inline subview_cube<eT> subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2); | |
98 arma_inline const subview_cube<eT> subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const; | |
99 | |
100 inline subview_cube<eT> subcube(const span& row_span, const span& col_span, const span& slice_span); | |
101 inline const subview_cube<eT> subcube(const span& row_span, const span& col_span, const span& slice_span) const; | |
102 | |
103 inline subview_cube<eT> operator()(const span& row_span, const span& col_span, const span& slice_span); | |
104 inline const subview_cube<eT> operator()(const span& row_span, const span& col_span, const span& slice_span) const; | |
105 | |
106 | |
107 inline void shed_slice(const uword slice_num); | |
108 | |
109 inline void shed_slices(const uword in_slice1, const uword in_slice2); | |
110 | |
111 inline void insert_slices(const uword slice_num, const uword N, const bool set_to_zero = true); | |
112 | |
113 template<typename T1> | |
114 inline void insert_slices(const uword row_num, const BaseCube<eT,T1>& X); | |
115 | |
116 | |
117 template<typename gen_type> inline Cube(const GenCube<eT, gen_type>& X); | |
118 template<typename gen_type> inline const Cube& operator=(const GenCube<eT, gen_type>& X); | |
119 template<typename gen_type> inline const Cube& operator+=(const GenCube<eT, gen_type>& X); | |
120 template<typename gen_type> inline const Cube& operator-=(const GenCube<eT, gen_type>& X); | |
121 template<typename gen_type> inline const Cube& operator%=(const GenCube<eT, gen_type>& X); | |
122 template<typename gen_type> inline const Cube& operator/=(const GenCube<eT, gen_type>& X); | |
123 | |
124 template<typename T1, typename op_type> inline Cube(const OpCube<T1, op_type>& X); | |
125 template<typename T1, typename op_type> inline const Cube& operator=(const OpCube<T1, op_type>& X); | |
126 template<typename T1, typename op_type> inline const Cube& operator+=(const OpCube<T1, op_type>& X); | |
127 template<typename T1, typename op_type> inline const Cube& operator-=(const OpCube<T1, op_type>& X); | |
128 template<typename T1, typename op_type> inline const Cube& operator%=(const OpCube<T1, op_type>& X); | |
129 template<typename T1, typename op_type> inline const Cube& operator/=(const OpCube<T1, op_type>& X); | |
130 | |
131 template<typename T1, typename eop_type> inline Cube(const eOpCube<T1, eop_type>& X); | |
132 template<typename T1, typename eop_type> inline const Cube& operator=(const eOpCube<T1, eop_type>& X); | |
133 template<typename T1, typename eop_type> inline const Cube& operator+=(const eOpCube<T1, eop_type>& X); | |
134 template<typename T1, typename eop_type> inline const Cube& operator-=(const eOpCube<T1, eop_type>& X); | |
135 template<typename T1, typename eop_type> inline const Cube& operator%=(const eOpCube<T1, eop_type>& X); | |
136 template<typename T1, typename eop_type> inline const Cube& operator/=(const eOpCube<T1, eop_type>& X); | |
137 | |
138 template<typename T1, typename op_type> inline Cube(const mtOpCube<eT, T1, op_type>& X); | |
139 template<typename T1, typename op_type> inline const Cube& operator=(const mtOpCube<eT, T1, op_type>& X); | |
140 template<typename T1, typename op_type> inline const Cube& operator+=(const mtOpCube<eT, T1, op_type>& X); | |
141 template<typename T1, typename op_type> inline const Cube& operator-=(const mtOpCube<eT, T1, op_type>& X); | |
142 template<typename T1, typename op_type> inline const Cube& operator%=(const mtOpCube<eT, T1, op_type>& X); | |
143 template<typename T1, typename op_type> inline const Cube& operator/=(const mtOpCube<eT, T1, op_type>& X); | |
144 | |
145 template<typename T1, typename T2, typename glue_type> inline Cube(const GlueCube<T1, T2, glue_type>& X); | |
146 template<typename T1, typename T2, typename glue_type> inline const Cube& operator=(const GlueCube<T1, T2, glue_type>& X); | |
147 template<typename T1, typename T2, typename glue_type> inline const Cube& operator+=(const GlueCube<T1, T2, glue_type>& X); | |
148 template<typename T1, typename T2, typename glue_type> inline const Cube& operator-=(const GlueCube<T1, T2, glue_type>& X); | |
149 template<typename T1, typename T2, typename glue_type> inline const Cube& operator%=(const GlueCube<T1, T2, glue_type>& X); | |
150 template<typename T1, typename T2, typename glue_type> inline const Cube& operator/=(const GlueCube<T1, T2, glue_type>& X); | |
151 | |
152 template<typename T1, typename T2, typename eglue_type> inline Cube(const eGlueCube<T1, T2, eglue_type>& X); | |
153 template<typename T1, typename T2, typename eglue_type> inline const Cube& operator=(const eGlueCube<T1, T2, eglue_type>& X); | |
154 template<typename T1, typename T2, typename eglue_type> inline const Cube& operator+=(const eGlueCube<T1, T2, eglue_type>& X); | |
155 template<typename T1, typename T2, typename eglue_type> inline const Cube& operator-=(const eGlueCube<T1, T2, eglue_type>& X); | |
156 template<typename T1, typename T2, typename eglue_type> inline const Cube& operator%=(const eGlueCube<T1, T2, eglue_type>& X); | |
157 template<typename T1, typename T2, typename eglue_type> inline const Cube& operator/=(const eGlueCube<T1, T2, eglue_type>& X); | |
158 | |
159 template<typename T1, typename T2, typename glue_type> inline Cube(const mtGlueCube<eT, T1, T2, glue_type>& X); | |
160 template<typename T1, typename T2, typename glue_type> inline const Cube& operator=(const mtGlueCube<eT, T1, T2, glue_type>& X); | |
161 template<typename T1, typename T2, typename glue_type> inline const Cube& operator+=(const mtGlueCube<eT, T1, T2, glue_type>& X); | |
162 template<typename T1, typename T2, typename glue_type> inline const Cube& operator-=(const mtGlueCube<eT, T1, T2, glue_type>& X); | |
163 template<typename T1, typename T2, typename glue_type> inline const Cube& operator%=(const mtGlueCube<eT, T1, T2, glue_type>& X); | |
164 template<typename T1, typename T2, typename glue_type> inline const Cube& operator/=(const mtGlueCube<eT, T1, T2, glue_type>& X); | |
165 | |
166 | |
167 arma_inline arma_warn_unused eT& operator[] (const uword i); | |
168 arma_inline arma_warn_unused eT operator[] (const uword i) const; | |
169 | |
170 arma_inline arma_warn_unused eT& at(const uword i); | |
171 arma_inline arma_warn_unused eT at(const uword i) const; | |
172 | |
173 arma_inline arma_warn_unused eT& operator() (const uword i); | |
174 arma_inline arma_warn_unused eT operator() (const uword i) const; | |
175 | |
176 arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col, const uword in_slice); | |
177 arma_inline arma_warn_unused eT at (const uword in_row, const uword in_col, const uword in_slice) const; | |
178 | |
179 arma_inline arma_warn_unused eT& operator() (const uword in_row, const uword in_col, const uword in_slice); | |
180 arma_inline arma_warn_unused eT operator() (const uword in_row, const uword in_col, const uword in_slice) const; | |
181 | |
182 arma_inline const Cube& operator++(); | |
183 arma_inline void operator++(int); | |
184 | |
185 arma_inline const Cube& operator--(); | |
186 arma_inline void operator--(int); | |
187 | |
188 arma_inline arma_warn_unused bool is_finite() const; | |
189 arma_inline arma_warn_unused bool is_empty() const; | |
190 | |
191 arma_inline arma_warn_unused bool in_range(const uword i) const; | |
192 arma_inline arma_warn_unused bool in_range(const span& x) const; | |
193 | |
194 arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const uword in_slice) const; | |
195 inline arma_warn_unused bool in_range(const span& row_span, const span& col_span, const span& slice_span) const; | |
196 | |
197 arma_inline arma_warn_unused eT* memptr(); | |
198 arma_inline arma_warn_unused const eT* memptr() const; | |
199 | |
200 arma_inline arma_warn_unused eT* slice_memptr(const uword slice); | |
201 arma_inline arma_warn_unused const eT* slice_memptr(const uword slice) const; | |
202 | |
203 arma_inline arma_warn_unused eT* slice_colptr(const uword in_slice, const uword in_col); | |
204 arma_inline arma_warn_unused const eT* slice_colptr(const uword in_slice, const uword in_col) const; | |
205 | |
206 inline void impl_print(const std::string& extra_text) const; | |
207 inline void impl_print(std::ostream& user_stream, const std::string& extra_text) const; | |
208 | |
209 inline void impl_raw_print(const std::string& extra_text) const; | |
210 inline void impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const; | |
211 | |
212 inline void set_size(const uword in_rows, const uword in_cols, const uword in_slices); | |
213 inline void reshape(const uword in_rows, const uword in_cols, const uword in_slices, const uword dim = 0); | |
214 inline void resize(const uword in_rows, const uword in_cols, const uword in_slices); | |
215 | |
216 template<typename eT2> inline void copy_size(const Cube<eT2>& m); | |
217 | |
218 inline const Cube& fill(const eT val); | |
219 | |
220 inline const Cube& zeros(); | |
221 inline const Cube& zeros(const uword in_rows, const uword in_cols, const uword in_slices); | |
222 | |
223 inline const Cube& ones(); | |
224 inline const Cube& ones(const uword in_rows, const uword in_cols, const uword in_slices); | |
225 | |
226 inline const Cube& randu(); | |
227 inline const Cube& randu(const uword in_rows, const uword in_cols, const uword in_slices); | |
228 | |
229 inline const Cube& randn(); | |
230 inline const Cube& randn(const uword in_rows, const uword in_cols, const uword in_slices); | |
231 | |
232 inline void reset(); | |
233 | |
234 | |
235 template<typename T1> inline void set_real(const BaseCube<pod_type,T1>& X); | |
236 template<typename T1> inline void set_imag(const BaseCube<pod_type,T1>& X); | |
237 | |
238 | |
239 inline arma_warn_unused eT min() const; | |
240 inline arma_warn_unused eT max() const; | |
241 | |
242 inline eT min(uword& index_of_min_val) const; | |
243 inline eT max(uword& index_of_max_val) const; | |
244 | |
245 inline eT min(uword& row_of_min_val, uword& col_of_min_val, uword& slice_of_min_val) const; | |
246 inline eT max(uword& row_of_max_val, uword& col_of_max_val, uword& slice_of_max_val) const; | |
247 | |
248 | |
249 inline bool save(const std::string name, const file_type type = arma_binary, const bool print_status = true) const; | |
250 inline bool save( std::ostream& os, const file_type type = arma_binary, const bool print_status = true) const; | |
251 | |
252 inline bool load(const std::string name, const file_type type = auto_detect, const bool print_status = true); | |
253 inline bool load( std::istream& is, const file_type type = auto_detect, const bool print_status = true); | |
254 | |
255 inline bool quiet_save(const std::string name, const file_type type = arma_binary) const; | |
256 inline bool quiet_save( std::ostream& os, const file_type type = arma_binary) const; | |
257 | |
258 inline bool quiet_load(const std::string name, const file_type type = auto_detect); | |
259 inline bool quiet_load( std::istream& is, const file_type type = auto_detect); | |
260 | |
261 | |
262 // iterators | |
263 | |
264 typedef eT* iterator; | |
265 typedef const eT* const_iterator; | |
266 | |
267 typedef eT* slice_iterator; | |
268 typedef const eT* const_slice_iterator; | |
269 | |
270 inline iterator begin(); | |
271 inline const_iterator begin() const; | |
272 | |
273 inline iterator end(); | |
274 inline const_iterator end() const; | |
275 | |
276 inline slice_iterator begin_slice(const uword slice_num); | |
277 inline const_slice_iterator begin_slice(const uword slice_num) const; | |
278 | |
279 inline slice_iterator end_slice(const uword slice_num); | |
280 inline const_slice_iterator end_slice(const uword slice_num) const; | |
281 | |
282 | |
283 template<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices> | |
284 class fixed : public Cube<eT> | |
285 { | |
286 private: | |
287 | |
288 static const uword fixed_n_elem = fixed_n_rows * fixed_n_cols * fixed_n_slices; | |
289 | |
290 arma_aligned Mat<eT>* mat_ptrs_local_extra[ (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? fixed_n_slices : 1 ]; | |
291 arma_aligned eT mem_local_extra [ (fixed_n_elem > Cube_prealloc::mem_n_elem) ? fixed_n_elem : 1 ]; | |
292 | |
293 arma_inline void mem_setup(); | |
294 | |
295 | |
296 public: | |
297 | |
298 inline fixed() { mem_setup(); } | |
299 | |
300 inline const Cube& operator=(const eT val) { mem_setup(); Cube<eT>::operator=(val); return *this; } | |
301 | |
302 template<typename T1> | |
303 inline fixed(const BaseCube<eT,T1>& A) { mem_setup(); Cube<eT>::operator=(A.get_ref()); } | |
304 | |
305 template<typename T1> | |
306 inline const Cube& operator=(const BaseCube<eT,T1>& A) { Cube<eT>::operator=(A.get_ref()); return *this; } | |
307 | |
308 template<typename T1, typename T2> | |
309 inline explicit fixed(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B) { mem_setup(); Cube<eT>::init(A,B); } | |
310 }; | |
311 | |
312 | |
313 protected: | |
314 | |
315 inline void init_cold(); | |
316 inline void init_warm(const uword in_rows, const uword in_cols, const uword in_slices); | |
317 | |
318 template<typename T1, typename T2> | |
319 inline void init(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B); | |
320 | |
321 inline void steal_mem(Cube& X); | |
322 | |
323 inline void delete_mat(); | |
324 inline void create_mat(); | |
325 | |
326 friend class glue_join; | |
327 friend class op_reshape; | |
328 friend class op_resize; | |
329 | |
330 | |
331 public: | |
332 | |
333 #ifdef ARMA_EXTRA_CUBE_PROTO | |
334 #include ARMA_INCFILE_WRAP(ARMA_EXTRA_CUBE_PROTO) | |
335 #endif | |
336 }; | |
337 | |
338 | |
339 | |
340 class Cube_aux | |
341 { | |
342 public: | |
343 | |
344 template<typename eT> arma_inline static void prefix_pp(Cube<eT>& x); | |
345 template<typename T> arma_inline static void prefix_pp(Cube< std::complex<T> >& x); | |
346 | |
347 template<typename eT> arma_inline static void postfix_pp(Cube<eT>& x); | |
348 template<typename T> arma_inline static void postfix_pp(Cube< std::complex<T> >& x); | |
349 | |
350 template<typename eT> arma_inline static void prefix_mm(Cube<eT>& x); | |
351 template<typename T> arma_inline static void prefix_mm(Cube< std::complex<T> >& x); | |
352 | |
353 template<typename eT> arma_inline static void postfix_mm(Cube<eT>& x); | |
354 template<typename T> arma_inline static void postfix_mm(Cube< std::complex<T> >& x); | |
355 | |
356 template<typename eT, typename T1> inline static void set_real(Cube<eT>& out, const BaseCube<eT,T1>& X); | |
357 template<typename eT, typename T1> inline static void set_imag(Cube<eT>& out, const BaseCube<eT,T1>& X); | |
358 | |
359 template<typename T, typename T1> inline static void set_real(Cube< std::complex<T> >& out, const BaseCube< T,T1>& X); | |
360 template<typename T, typename T1> inline static void set_imag(Cube< std::complex<T> >& out, const BaseCube< T,T1>& X); | |
361 }; | |
362 | |
363 | |
364 | |
365 //! @} |