SHOGUN  v1.1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Array3.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Written (W) 1999-2009 Soeren Sonnenburg, Gunnar Raetsch
8  * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
9  */
10 
11 #ifndef _ARRAY3_H_
12 #define _ARRAY3_H_
13 
14 #include <shogun/lib/common.h>
15 #include <shogun/base/SGObject.h>
16 #include <shogun/lib/Array.h>
17 
18 namespace shogun
19 {
20 template <class T> class CArray3;
21 
28 template <class T> class CArray3: public CArray<T>
29 {
30  public:
33  : CArray<T>(1), dim1_size(1), dim2_size(1), dim3_size(1)
34  {
35  }
36 
43  CArray3(int32_t dim1, int32_t dim2, int32_t dim3)
44  : CArray<T>(dim1*dim2*dim3), dim1_size(dim1), dim2_size(dim2), dim3_size(dim3)
45  {
46  }
47 
57  CArray3(T* p_array, int32_t dim1, int32_t dim2, int32_t dim3,
58  bool p_free_array=true, bool p_copy_array=false)
59  : CArray<T>(p_array, dim1*dim2*dim3, p_free_array, p_copy_array),
60  dim1_size(dim1), dim2_size(dim2), dim3_size(dim3)
61  {
62  }
63 
64 
72  CArray3(const T* p_array, int32_t dim1, int32_t dim2, int32_t dim3)
73  : CArray<T>(p_array, dim1*dim2*dim3),
74  dim1_size(dim1), dim2_size(dim2), dim3_size(dim3)
75  {
76  }
77 
78  virtual ~CArray3() {}
79 
84  inline void set_array_name(const char * p_name)
85  {
87  }
88 
95  inline void get_array_size(int32_t & dim1, int32_t & dim2, int32_t & dim3)
96  {
97  dim1=dim1_size;
98  dim2=dim2_size;
99  dim3=dim3_size;
100  }
101 
106  inline int32_t get_dim1() { return dim1_size; }
107 
112  inline int32_t get_dim2() { return dim2_size; }
113 
118  inline int32_t get_dim3() { return dim3_size ;
119  }
120 
122  inline void zero() { CArray<T>::zero(); }
123 
125  inline void set_const(T const_elem)
126  {
127  CArray<T>::set_const(const_elem) ;
128  }
129 
137  inline T* get_array() { return CArray<T>::array; }
138 
148  inline void set_array(T* p_array, int32_t dim1, int32_t dim2, int32_t dim3, bool p_free_array, bool copy_array=false)
149  {
150  dim1_size=dim1;
151  dim2_size=dim2;
152  dim3_size=dim3;
153  CArray<T>::set_array(p_array, dim1*dim2*dim3, p_free_array, copy_array);
154  }
155 
163  inline bool resize_array(int32_t dim1, int32_t dim2, int32_t dim3)
164  {
165  dim1_size=dim1;
166  dim2_size=dim2;
167  dim3_size=dim3;
168  return CArray<T>::resize_array(dim1*dim2*dim3);
169  }
170 
178  inline T get_element(int32_t idx1, int32_t idx2, int32_t idx3) const
179  {
180  ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
181  ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
182  ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
183  return CArray<T>::get_element(idx1+dim1_size*(idx2+dim2_size*idx3));
184  }
185 
194  inline bool set_element(T p_element, int32_t idx1, int32_t idx2, int32_t idx3)
195  {
196  ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
197  ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
198  ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
199  return CArray<T>::set_element(p_element, idx1+dim1_size*(idx2+dim2_size*idx3));
200  }
201 
209  inline const T& element(int32_t idx1, int32_t idx2, int32_t idx3) const
210  {
211  ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
212  ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
213  ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
214  return CArray<T>::element(idx1+dim1_size*(idx2+dim2_size*idx3));
215  }
216 
224  inline T& element(int32_t idx1, int32_t idx2, int32_t idx3)
225  {
226  ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
227  ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
228  ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
229  return CArray<T>::element(idx1+dim1_size*(idx2+dim2_size*idx3));
230  }
231 
240  inline T& element(T* p_array, int32_t idx1, int32_t idx2, int32_t idx3)
241  {
242  ARRAY_ASSERT(p_array==CArray<T>::array);
243  ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
244  ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
245  ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
246  return p_array[idx1+dim1_size*(idx2+dim2_size*idx3)];
247  }
248 
259  inline T& element(T* p_array, int32_t idx1, int32_t idx2, int32_t idx3, int32_t p_dim1_size, int32_t p_dim2_size)
260  {
261  ARRAY_ASSERT(p_array==CArray<T>::array);
262  ARRAY_ASSERT(p_dim1_size==dim1_size);
263  ARRAY_ASSERT(p_dim2_size==dim2_size);
264  ARRAY_ASSERT(idx1>=0 && idx1<p_dim1_size);
265  ARRAY_ASSERT(idx2>=0 && idx2<p_dim2_size);
266  ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
267  return p_array[idx1+p_dim1_size*(idx2+p_dim2_size*idx3)];
268  }
269 
276  {
277  CArray<T>::operator=(orig);
278  dim1_size=orig.dim1_size;
279  dim2_size=orig.dim2_size;
280  dim3_size=orig.dim3_size;
281  return *this;
282  }
283 
285  void display_size() const
286  {
287  CArray<T>::SG_PRINT( "3d-Array of size: %dx%dx%d\n",dim1_size, dim2_size, dim3_size);
288  }
289 
291  void display_array() const
292  {
293  if (CArray<T>::get_name())
294  CArray<T>::SG_PRINT( "3d-Array '%s' of size: %dx%dx%d\n", CArray<T>::get_name(), dim1_size, dim2_size, dim3_size);
295  else
296  CArray<T>::SG_PRINT( "2d-Array of size: %dx%dx%d\n",dim1_size, dim2_size, dim3_size);
297  for (int32_t k=0; k<dim3_size; k++)
298  for (int32_t i=0; i<dim1_size; i++)
299  {
300  CArray<T>::SG_PRINT( "element(%d,:,%d) = [ ",i, k);
301  for (int32_t j=0; j<dim2_size; j++)
302  CArray<T>::SG_PRINT( "%1.1f,", (float32_t)element(i,j,k));
303  CArray<T>::SG_PRINT( " ]\n");
304  }
305  }
306 
308  inline virtual const char* get_name() { return "Array3"; }
309 
310  protected:
312  int32_t dim1_size;
314  int32_t dim2_size;
316  int32_t dim3_size;
317 };
318 }
319 #endif

SHOGUN Machine Learning Toolbox - Documentation