Structural deformable models
DMatrix.h
Go to the documentation of this file.
1 #ifndef _DMATRIX_H_
2 #define _DMATRIX_H_
3 
4 #include <iostream>
5 #include <vector>
6 #include <math.h>
7 #include "common.h"
8 #include <Eigen/Core>
9 
12 template<class T>
13 class DMatrix {
14 public:
15  typedef typename std::vector<T>::const_iterator const_iterator;
16  typedef typename std::vector<T>::iterator iterator;
17  typedef T* TPtr;
18  typedef const T* CTPtr;
19  typedef DMatrix<T> MT;
20  typedef typename Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> EMT;
21 
22  DMatrix(dword _sx=0, dword _sy=0, const T& inival = T())
23  : sx(_sx), sy(_sy), values(_sx*_sy, inival) {}
24  DMatrix(dword _sx, dword _sy, const T* data)
25  : sx(_sx), sy(_sy), values(_sx*_sy) {
26  operator=(data);
27  }
28  ~DMatrix() {}
29 
30  MT& resize(dword _sx, dword _sy, const T& inival = T()) {
31  sx = _sx; sy = _sy;
32  values.resize(sx*sy, inival);
33  return *this;
34  }
35  MT& reshape(dword _sx, dword _sy) {
36  assert(sx*sy == _sx*_sy);
37  sx = _sx; sy = _sy;
38  return *this;
39  }
40  void clear() { values.clear(); sx = sy = 0; }
41 
42  dword sizeX() const { return sx; }
43  dword sizeY() const { return sy; }
44  dword size() const { return values.size(); }
45  dword index(dword x, dword y) const { return y*sx+x; }
46  T& at(dword x, dword y) { return values[index(x,y)]; }
47  const T& at(dword x, dword y) const { return values[index(x,y)]; }
48  std::vector<T>& getData() { return values; }
49  const std::vector<T>& getData() const { return values; }
50  bool empty() const { return values.empty(); }
51 
52  MT& operator=(const T& rhs) {
53  for(iterator vi = values.begin(); vi != values.end(); vi++)
54  *vi += rhs;
55  return *this;
56  }
57 
58  MT& operator=(const T* rhs) {
59  for(iterator vi = values.begin(); vi != values.end(); vi++, rhs++)
60  *vi += *rhs;
61  return *this;
62  }
63 
64  MT& operator+=(const MT& rhs) {
65  const_iterator ri = rhs.values.begin();
66  for(iterator vi = values.begin(); vi != values.end(); vi++, ri++)
67  *vi += *ri;
68  return *this;
69  }
70  MT& operator-=(const MT& rhs) {
71  const_iterator ri = rhs.values.begin();
72  for(iterator vi = values.begin(); vi != values.end(); vi++, ri++)
73  *vi -= *ri;
74  return *this;
75  }
76  MT& operator*=(const MT& rhs) {
77  const_iterator ri = rhs.values.begin();
78  for(iterator vi = values.begin(); vi != values.end(); vi++, ri++)
79  *vi *= *ri;
80  return *this;
81  }
82  MT& operator/=(const MT& rhs) {
83  const_iterator ri = rhs.values.begin();
84  for(iterator vi = values.begin(); vi != values.end(); vi++, ri++)
85  *vi /= *ri;
86  return *this;
87  }
88 
89  MT& operator+=(const T& rhs) {
90  for(iterator vi = values.begin(); vi != values.end(); vi++)
91  *vi += rhs;
92  return *this;
93  }
94  MT& operator-=(const T& rhs) {
95  for(iterator vi = values.begin(); vi != values.end(); vi++)
96  *vi -= rhs;
97  return *this;
98  }
99  MT& operator*=(const T& rhs) {
100  for(iterator vi = values.begin(); vi != values.end(); vi++)
101  *vi *= rhs;
102  return *this;
103  }
104  MT& operator/=(const T& rhs) {
105  for(iterator vi = values.begin(); vi != values.end(); vi++)
106  *vi /= rhs;
107  return *this;
108  }
109 
110  MT& max(const MT& rhs) {
111  const_iterator ri = rhs.values.begin();
112  for(iterator vi = values.begin(); vi != values.end(); vi++, ri++)
113  if(*vi < *ri) *vi = *ri;
114  return *this;
115  }
116  MT& max(const T& rhs) {
117  for(iterator vi = values.begin(); vi != values.end(); vi++)
118  if(*vi < rhs) *vi = rhs;
119  return *this;
120  }
121  T max() const {
122  assert(sx>0 && sy>0);
123  //T val = std::numeric_limits<T>::min();
124  T val(values[0]);
125  for(const_iterator vi = values.begin(); vi != values.end(); vi++)
126  if(*vi > val) val = *vi;
127  return val;
128  }
129  MT& min(const MT& rhs) {
130  const_iterator ri = rhs.values.begin();
131  for(iterator vi = values.begin(); vi != values.end(); vi++, ri++)
132  if(*vi > *ri) *vi = *ri;
133  return *this;
134  }
135  MT& min(const T& rhs) {
136  for(iterator vi = values.begin(); vi != values.end(); vi++)
137  if(*vi > rhs) *vi = rhs;
138  return *this;
139  }
140  T min() const {
141  assert(sx>0 && sy>0);
142  //T val = std::numeric_limits<T>::max();
143  T val(values[0]);
144  for(const_iterator vi = values.begin(); vi != values.end(); vi++)
145  if(*vi < val) val = *vi;
146  return val;
147  }
148 
149  MT mulRight(const MT& rhs) const {
150  assert(rhs.sy == sx);
151  MT res(rhs.sx, sy, T(0));
152  for(dword rx=0; rx<rhs.sx; rx++)
153  for( dword ly=0; ly<sy; ly++)
154  for(dword ry=0; ry<rhs.sy; ry++)
155  res.at(rx, ly) += at(ry, ly)*rhs.at(rx, ry);
156  return res;
157  }
158 
159  MT mulLeft(const MT& rhs) const {
160  return rhs.mulRight(*this);
161  }
162 
163  MT& setCol(dword col, MT& vec) {
164  assert(sy == vec.getData().size());
165  iterator vi = values.begin()+col;
166  for(const_iterator ri = vec.getData().begin();
167  ri != vec.getData().end(); ri++, vi+=sx)
168  *vi = *ri;
169  return *this;
170  }
171  MT& setCol(dword col, const T& val=1) {
172  iterator vi = values.begin()+col;
173  for(dword i=0; i<sy; i++, vi+=sx)
174  *vi = val;
175  return *this;
176  }
177  MT& setRow(dword row, MT& vec) {
178  assert(sx == vec.getData().size());
179  iterator vi = values.begin()+(row*sx);
180  for(const_iterator ri = vec.getData().begin();
181  ri != vec.getData().end(); ri++, vi++)
182  *vi = *ri;
183  return *this;
184  }
185  MT& setRange(dword ox, dword oy, const MT& mat) {
186  assert(ox<sx && oy<sy);
187  dword width = mat.sx <= sx-ox ? mat.sx : sx-ox;
188  dword height = mat.sy <= sy-oy ? mat.sy : sy-oy;
189  for(dword y = 0; y<height; y++) {
190  iterator dst = values.begin()+index(ox,oy+y);
191  const_iterator src = mat.values.begin() + mat.index(0,y);
192  for(dword x=0; x<width; x++, src++, dst++)
193  *dst = *src;
194  }
195  return *this;
196  }
197  MT& getRange(dword ox, dword oy, MT& mat) const {
198  assert(ox<sx && oy<sy);
199  dword width = mat.sx <= sx-ox ? mat.sx : sx-ox;
200  dword height = mat.sy <= sy-oy ? mat.sy : sy-oy;
201  for(dword y = 0; y<height; y++) {
202  const_iterator src = values.begin()+index(ox,oy+y);
203  iterator dst = mat.values.begin() + mat.index(0,y);
204  for(dword x=0; x<width; x++, src++, dst++)
205  *dst = *src;
206  }
207  return mat;
208  }
209  MT& setRow(dword row, const T& val=1) {
210  iterator vi = values.begin()+(row*sx);
211  for(dword i=0; i<sx; i++, vi++)
212  *vi = val;
213  return *this;
214  }
215  MT& setDiag(MT& vec, int offset=0) {
216  int count = offset>=0 ? sx-offset : sy+offset;
217  assert( count <= vec.getData().size() );
218  iterator vi = values.begin() + ( offset>=0 ? offset : -offset*sx);
219  for(const_iterator ri = vec.getData().begin(); count>0;
220  count--, ri++, vi+=sx+1)
221  *vi = *ri;
222  return *this;
223  }
224  MT& setDiag(const T& val=1, int offset=0) {
225  int count = offset>=0 ? sx-offset : sy+offset;
226  iterator vi = values.begin() + ( offset>=0 ? offset : -offset*sx);
227  for(; count>0; count--, vi+=(sx+1))
228  *vi = val;
229  return *this;
230  }
231  MT getDiag(int offset=0) {
232  int count = offset>=0 ? sx-offset : sy+offset;
233  MT res(1,count);
234  const_iterator vi = values.begin()+( offset>=0 ? offset : -offset*sx);
235  for(iterator ri = res.getData().begin(); count>0;
236  count--, ri++, vi+=sx+1)
237  *ri = *vi;
238  return res;
239  }
240 
241  MT& setUpper(const T& val = 1, int offset=0) {
242  int i=0,j=0;
243  for(iterator mi = values.begin();
244  mi != values.end(); mi++, i++) {
245  if(i==sx) { j++; i=0; }
246  if(i-j>=offset) *mi = val;
247  }
248  return *this;
249  }
250  MT& setLower(const T& val = 1, int offset=0) {
251  int i=0,j=0;
252  for(iterator mi = values.begin();
253  mi != values.end(); mi++, i++) {
254  if(i==(int)sx) { j++; i=0; }
255  if(i-j<=offset) *mi = val;
256  }
257  return *this;
258  }
259 
260  MT& transpose() {
261  if(sx*sy>1) {
262  if(sx==sy)
263  for(dword j=0; j<sy-1; j++)
264  for(dword i = j+1; i<sx; i++)
265  {
266  T& a = at(i,j);
267  T& b = at(j,i);
268  T dummy = a; a = b; b = dummy;
269  }
270  else if(sx == 1 || sy == 1) reshape(sy, sx);
271  else {
272  MT tmp(*this);
273  reshape(sy,sx);
274  for(dword j=0; j<sy; j++)
275  for(dword i = 0; i<sx; i++)
276  {
277  at(i,j) = tmp.at(j,i);
278  }
279  }
280  }
281  return *this;
282  }
283 
284  friend std::ostream& operator<<(std::ostream& os, const DMatrix<T>& rhs) {
285  os << rhs.sx << " " << rhs.sy;
286  dword cc=0;
287  for(const_iterator vi = rhs.values.begin();
288  vi != rhs.values.end(); vi++, cc--) {
289  if(!cc) { cc = rhs.sx; os << std::endl; }
290  else os << " ";
291  os << *vi;
292  }
293  os << std::endl;
294  return os;
295  }
296  friend std::istream& operator>>(std::istream& is, DMatrix<T>& rhs) {
297  is >> rhs.sx; is >> rhs.sy;
298  rhs.resize(rhs.sx, rhs.sy);
299  for(iterator vi = rhs.values.begin();
300  vi != rhs.values.end(); vi++)
301  is >> *vi;
302  return is;
303  }
304 
305 protected:
307  std::vector<T> values;
308 };
309 
313 
314 #endif
MT & transpose()
Definition: DMatrix.h:260
MT & setUpper(const T &val=1, int offset=0)
Definition: DMatrix.h:241
DMatrix< T > MT
Definition: DMatrix.h:19
MT & operator/=(const T &rhs)
Definition: DMatrix.h:104
MT & reshape(dword _sx, dword _sy)
Definition: DMatrix.h:35
T max() const
Definition: DMatrix.h:121
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > EMT
Definition: DMatrix.h:20
MT getDiag(int offset=0)
Definition: DMatrix.h:231
~DMatrix()
Definition: DMatrix.h:28
bool empty() const
Definition: DMatrix.h:50
T min() const
Definition: DMatrix.h:140
const T * CTPtr
Definition: DMatrix.h:18
std::vector< T > values
Definition: DMatrix.h:307
MT & setCol(dword col, const T &val=1)
Definition: DMatrix.h:171
const std::vector< T > & getData() const
Definition: DMatrix.h:49
void clear()
Definition: DMatrix.h:40
DMatrix< float > DMatrixf
Definition: DMatrix.h:311
MT & min(const T &rhs)
Definition: DMatrix.h:135
MT & operator/=(const MT &rhs)
Definition: DMatrix.h:82
DMatrix< int > DMatrixi
Definition: DMatrix.h:310
MT & operator-=(const MT &rhs)
Definition: DMatrix.h:70
MT & setDiag(const T &val=1, int offset=0)
Definition: DMatrix.h:224
MT & min(const MT &rhs)
Definition: DMatrix.h:129
dword sy
Definition: DMatrix.h:306
DMatrix(dword _sx, dword _sy, const T *data)
Definition: DMatrix.h:24
MT & operator=(const T *rhs)
Definition: DMatrix.h:58
MT & operator*=(const MT &rhs)
Definition: DMatrix.h:76
dword sizeX() const
Definition: DMatrix.h:42
MT & setDiag(MT &vec, int offset=0)
Definition: DMatrix.h:215
MT & max(const T &rhs)
Definition: DMatrix.h:116
MT & operator=(const T &rhs)
Definition: DMatrix.h:52
MT & operator*=(const T &rhs)
Definition: DMatrix.h:99
MT & resize(dword _sx, dword _sy, const T &inival=T())
Definition: DMatrix.h:30
DMatrix< double > DMatrixd
Definition: DMatrix.h:312
unsigned long dword
Definition: simpletypes.h:6
MT mulLeft(const MT &rhs) const
Definition: DMatrix.h:159
std::vector< T >::const_iterator const_iterator
Definition: DMatrix.h:15
dword size() const
Definition: DMatrix.h:44
T * TPtr
Definition: DMatrix.h:17
DMatrix(dword _sx=0, dword _sy=0, const T &inival=T())
Definition: DMatrix.h:22
MT & max(const MT &rhs)
Definition: DMatrix.h:110
MT & setRange(dword ox, dword oy, const MT &mat)
Definition: DMatrix.h:185
MT & setRow(dword row, const T &val=1)
Definition: DMatrix.h:209
dword index(dword x, dword y) const
Definition: DMatrix.h:45
std::vector< T >::iterator iterator
Definition: DMatrix.h:16
MT & setCol(dword col, MT &vec)
Definition: DMatrix.h:163
MT & setLower(const T &val=1, int offset=0)
Definition: DMatrix.h:250
dword sizeY() const
Definition: DMatrix.h:43
MT & setRow(dword row, MT &vec)
Definition: DMatrix.h:177
MT & operator-=(const T &rhs)
Definition: DMatrix.h:94
MT & operator+=(const T &rhs)
Definition: DMatrix.h:89
const T & at(dword x, dword y) const
Definition: DMatrix.h:47
T & at(dword x, dword y)
Definition: DMatrix.h:46
MT & operator+=(const MT &rhs)
Definition: DMatrix.h:64
MT & getRange(dword ox, dword oy, MT &mat) const
Definition: DMatrix.h:197
friend std::istream & operator>>(std::istream &is, DMatrix< T > &rhs)
Definition: DMatrix.h:296
std::vector< T > & getData()
Definition: DMatrix.h:48
dword sx
Definition: DMatrix.h:306
MT mulRight(const MT &rhs) const
Definition: DMatrix.h:149