cgv
diag_mat.h
1 #pragma once
2 
3 #include "vec.h"
4 #include "mat.h"
5 #include "up_tri_mat.h"
6 
7 namespace cgv{
8  namespace math{
9 
14 template <typename T>
15 struct diag_mat
16 {
17 
18 public:
21 public:
22  typedef typename vec<T>::value_type value_type;
23  typedef typename vec<T>::reference reference;
24  typedef typename vec<T>::const_reference const_reference;
25  typedef typename vec<T>::pointer pointer;
26  typedef typename vec<T>::const_pointer const_pointer;
27 
28  typedef typename vec<T>::iterator iterator;
29  typedef typename vec<T>::const_iterator const_iterator;
30  typedef typename vec<T>::reverse_iterator reverse_iterator;
31  typedef typename vec<T>::const_reverse_iterator const_reverse_iterator;
32 
33  typedef iterator diag_iterator;
34  typedef const diag_iterator const_diag_iterator;
35  typedef std::reverse_iterator<diag_iterator> reverse_diag_iterator;
36  typedef std::reverse_iterator<const_diag_iterator> const_reverse_diag_iterator;
37 
38  iterator begin(){return _data.begin();}
39  iterator end(){return _data.end();}
40  const_iterator begin() const{return _data.begin();}
41  const_iterator end() const{return _data.end();}
42  reverse_iterator rbegin(){return _data.rbegin();}
43  reverse_iterator rend(){return _data.rend();}
44  const_reverse_iterator rbegin() const{return _data.rbegin();}
45  const_reverse_iterator rend() const {return _data.rend();}
46 
47  diag_iterator diag_begin(){return _data.begin();}
48  diag_iterator diag_end(){return _data.end();}
49  const_diag_iterator diag_begin() const{return _data.begin();}
50  const_diag_iterator diag_end() const{return _data.end();}
51  reverse_diag_iterator diag_rbegin(){return _data.rbegin();}
52  reverse_diag_iterator diag_rend(){return _data.rend();}
53  const_reverse_diag_iterator diag_rbegin() const{return _data.rbegin();}
54  const_reverse_diag_iterator diag_rend() const {return _data.rend();}
55 
57  unsigned size() const
58  {
59  return _data.size();
60  }
61 
63  unsigned nrows() const
64  {
65  return size();
66  }
67 
69  unsigned ncols() const
70  {
71  return size();
72  }
73 
76  {
77  }
78 
80  explicit diag_mat(unsigned n):_data(n)
81  {
82  }
83 
85  diag_mat(unsigned n, const T& c)
86  {
87  resize(n);
88  fill(c);
89  }
90 
91  //creates nxn diagonal matrix from array containing the diagonal elements
92  diag_mat(unsigned n, const T* marray):_data(n,marray)
93  {
94  }
95 
97  diag_mat(const vec<T>& dv):_data(dv)
98  {
99  }
100 
102  diag_mat(const mat<T>& m)
103  {
104  int n = std::min(m.ncols(),m.nrows());
105  resize(n);
106  for(int i =0; i < n; i++)
107  _data[i]=m(i,i);
108  }
109 
112  {
113  _data=m._data;
114  }
115 
116 
117 
119  virtual ~diag_mat()
120  {
121  }
122 
124  operator T*()
125  {
126  return (T*)_data;
127  }
128 
130  operator const T*() const
131  {
132  return (const T*)_data;
133  }
134 
136  diag_mat<T> sub_mat(unsigned top_left, unsigned size) const
137  {
138  diag_mat<T> D(size);
139  for (unsigned int i=0; i<size; ++i)
140  D(i) = (*this)(i+top_left);
141  return D;
142  }
144  operator const mat<T>() const
145  {
146  mat<T> m;
147  m.zeros(size(),size());
148 
149  for(unsigned i =0; i < size();i++)
150  m(i,i)=operator()(i);
151 
152  return m;
153  }
154 
155 
156  //resize the diagonal matrix to nxn
157  void resize(unsigned n)
158  {
159  _data.resize(n);
160  }
161 
163  void identity()
164  {
165  fill((T)1);
166  }
167 
169  void fill(const T& c)
170  {
171  for(unsigned i=0;i < size();i++)
172  {
173  _data[i]=c;
174  }
175  }
177  void zeros()
178  {
179  fill((T)0);
180  }
181 
183  void exchange_diagonal_elements(unsigned i, unsigned j)
184  {
185  std::swap(_data[i],_data[j]);
186  }
187 
189  const T& operator() (unsigned i) const
190  {
191  return _data[i];
192  }
193 
195  T& operator() (unsigned i)
196  {
197  return _data[i];
198  }
199 
200 
202  bool is_square()
203  {
204  return true;
205  }
206 
207  //transpose (does nothing)
208  void transpose(){}
209 
210 
213  {
214  _data =m._data;
215  return *this;
216  }
217 
219  template <typename S>
221  {
222  resize(m.size());
223  for(unsigned i = 0; i < size(); i++)
224  _data[i]=(T)m(i);
225  return *this;
226  }
227 
230  template <typename S>
232  {
233  _data=v;
234  return *this;
235  }
236 
238  diag_mat<T>& operator = (const T& s)
239  {
240  fill (s);
241  return *this;
242  }
243 
244 
245 
247  T frobenius_norm() const
248  {
249  T n=0;
250  for(int i =0; i < size();i++)
251  n+=_data[i]*_data[i];
252 
253  return (T)sqrt((double)n);
254  }
255 
256 
257 
258 
260  void identity(unsigned dim)
261  {
262  resize(dim);
263  for(unsigned i = 0; i < size();++i)
264  _data[i]=1;
265  }
266 
268  void zero()
269  {
270  fill(0);
271  }
272 
275  {
276  assert(d.nrows() == nrows());
277  _data += d._data;
278  return *this;
279  }
280 
283  {
284  assert(d.nrows() == nrows());
285  _data -= d._data;
286  return *this;
287  }
288 
290  diag_mat<T>& operator*=(const T& s)
291  {
292  _data *=s;
293  return *this;
294  }
295 
297  diag_mat<T> operator*(const T& s) const
298  {
299  diag_mat<T> r=*this;
300  r*=s;
301  return r;
302  }
303 
306  {
307  diag_mat<T> r=*this;
308  r += d;
309  return r;
310  }
311 
314  {
315  diag_mat<T>r = *this;
316  r-= d;
317  return r;
318  }
319 
320 
321 
323  vec<T> operator*(const vec<T>& v) const
324  {
325  assert(v.dim() == ncols());
326  vec<T> r(size());
327  for(unsigned i = 0; i < size();i++)
328  r(i) = _data[i]*v(i);
329  return r;
330  }
331 
333  const up_tri_mat<T> operator*( const up_tri_mat<T>& m)
334  {
335  assert(m.nrows() == size());
336 
337  up_tri_mat<T> r(size());
338 
339  for(unsigned i = 0; i < size(); i++)
340  for(unsigned j = 0; j < m.ncols();j++)
341  r(i,j) = operator()(i)*m(i,j);
342 
343  return r;
344  }
345 
347  operator mat<T>()
348  {
349  mat<T> m(size(),size(),(T)0);
350  for(unsigned i = 0; i < size();i++)
351  {
352  m(i,i)=_data[i];
353  }
354  return m;
355  }
356 
357 };
358 
359 //matrix multiplication of matrix m by a diagonal matrix s
360 template <typename T, typename S>
361 const mat<T> operator*(const mat<T>& m,const diag_mat<S>& s)
362 {
363  assert(m.ncols() == s.size());
364  mat<T> r(m.nrows(),s.size());
365  for(unsigned i = 0; i < m.nrows(); i++)
366  for(unsigned j = 0; j < s.size();j++)
367  r(i,j) = s(j)*m(i,j);
368 
369  return r;
370 }
371 
373 template <typename T>
374 const diag_mat<T> operator*(const T& s, const diag_mat<T>& m)
375 {
376  return m*s;
377 }
378 
380 template <typename T, typename S>
381 const diag_mat<T> operator*(const diag_mat<S>& s, const diag_mat<T>& m)
382 {
383  assert(m.size() == s.size());
384 
385  diag_mat<T> r(s.size());
386 
387  for(unsigned i = 0; i < s.size(); i++)
388  r(i) = s(i)*m(i);
389 
390  return r;
391 }
393 template<typename T>
394 mat<T> operator*(const perm_mat& p, const diag_mat<T>& m)
395 {
396  mat<T> r=m;
397  return p*r;
398 }
399 
401 template<typename T>
402 mat<T> operator*(const diag_mat<T>& m,const perm_mat& p)
403 {
404  mat<T> r=m;
405  return r*p;
406 }
407 
409 template <typename T>
410 const mat<T> operator*(const diag_mat<T>& s, const mat<T>& m)
411 {
412  assert(m.nrows() == s.size());
413 
414  mat<T> r(s.size(),m.ncols());
415 
416  for(unsigned i = 0; i < s.size(); i++)
417  for(unsigned j = 0; j < m.ncols();j++)
418  r(i,j) = s(i)*m(i,j);
419 
420  return r;
421 }
422 
424 template <typename T>
425 const up_tri_mat<T> operator*(const up_tri_mat<T>& m,const diag_mat<T>& s)
426 {
427  assert(m.ncols() == s.size());
428  up_tri_mat<T> r(s.size());
429  for(unsigned i = 0; i < m.nrows(); i++)
430  for(unsigned j = i; j < s.size();j++)
431  r(i,j) = s(j)*m(i,j);
432 
433  return r;
434 }
435 
436 
437 
438 
439 
441 template <typename T>
442 std::ostream& operator<<(std::ostream& out, const diag_mat<T>& m)
443 {
444 
445  for (int i=0;i<(int)m.size();++i)
446  out << m(i)<<" ";
447 
448  return out;
449 }
450 
452 template <typename T>
453 std::istream& operator>>(std::istream& in, diag_mat<T>& m)
454 {
455  assert(m.size() > 0);
456  for (int i=0;i<(int)m.size();++i)
457  in >> m(i);
458 
459  return in;
460 }
461 
462 
463 }
464 }
cgv::math::diag_mat::size
unsigned size() const
size of storage
Definition: diag_mat.h:57
cgv::math::diag_mat::diag_mat
diag_mat()
standard constructor
Definition: diag_mat.h:75
cgv::math::diag_mat::frobenius_norm
T frobenius_norm() const
returns the frobenius norm of matrix m
Definition: diag_mat.h:247
cgv::math::diag_mat::operator*
vec< T > operator*(const vec< T > &v) const
multiplication with vector
Definition: diag_mat.h:323
cgv::math::perm_mat
Definition: perm_mat.h:13
cgv::math::mat
Definition: mat.h:14
cgv::math::diag_mat::diag_mat
diag_mat(const vec< T > &dv)
creates a diagonal matrix and set the diagonal vector to dv
Definition: diag_mat.h:97
cgv::math::diag_mat::identity
void identity(unsigned dim)
set dim x dim identity matrix
Definition: diag_mat.h:260
cgv::math::diag_mat::_data
vec< T > _data
pointer to data storage
Definition: diag_mat.h:20
cgv::math::diag_mat::operator*=
diag_mat< T > & operator*=(const T &s)
in place multiplication with scalar s
Definition: diag_mat.h:290
cgv::math::vec
A column vector class.
Definition: fvec.h:13
cgv::math::diag_mat::~diag_mat
virtual ~diag_mat()
destructor
Definition: diag_mat.h:119
cgv::math::diag_mat::operator*
const up_tri_mat< T > operator*(const up_tri_mat< T > &m)
matrix multiplication of matrix m by a diagonal matrix s
Definition: diag_mat.h:333
cgv::math::diag_mat::diag_mat
diag_mat(unsigned n)
creates nxn diagonal matrix
Definition: diag_mat.h:80
cgv::math::operator<<
std::ostream & operator<<(std::ostream &out, const diag_mat< T > &m)
output of a diagonal matrix onto an ostream
Definition: diag_mat.h:442
cgv::math::diag_mat::operator+=
diag_mat< T > & operator+=(const diag_mat< T > &d)
in place addition of diagonal matrix
Definition: diag_mat.h:274
cgv::math::diag_mat
Definition: diag_mat.h:16
cgv::math::diag_mat::operator()
const T & operator()(unsigned i) const
const access to the ith diagonal element
Definition: diag_mat.h:189
cgv::math::diag_mat::operator=
diag_mat< T > & operator=(const diag_mat< T > &m)
assignment of a matrix with the same element type
Definition: diag_mat.h:212
cgv::math::diag_mat::ncols
unsigned ncols() const
number of columns
Definition: diag_mat.h:69
cgv::math::operator>>
std::istream & operator>>(std::istream &in, diag_mat< T > &m)
input of a diagonal matrix from an istream
Definition: diag_mat.h:453
cgv::math::diag_mat::nrows
unsigned nrows() const
number of rows
Definition: diag_mat.h:63
cgv::math::diag_mat::diag_mat
diag_mat(const diag_mat< T > &m)
copy constructor
Definition: diag_mat.h:111
cgv::math::diag_mat::sub_mat
diag_mat< T > sub_mat(unsigned top_left, unsigned size) const
create sub diagonal matrix d(top_left)...d(top_left+size)
Definition: diag_mat.h:136
cgv::math::diag_mat::zeros
void zeros()
fills all diagonal entries with zero
Definition: diag_mat.h:177
cgv::math::diag_mat::operator-=
diag_mat< T > & operator-=(const diag_mat< T > &d)
in place subtraction of diagonal matrix
Definition: diag_mat.h:282
cgv::math::diag_mat::diag_mat
diag_mat(const mat< T > &m)
creates a diagonal matrix and set the diagonal vector to diagonal entries of m
Definition: diag_mat.h:102
cgv::math::diag_mat::operator+
diag_mat< T > operator+(const diag_mat< T > &d) const
addition of diagonal matrix
Definition: diag_mat.h:305
cgv::math::diag_mat::fill
void fill(const T &c)
fills all diagonal entries with c
Definition: diag_mat.h:169
cgv::math::diag_mat::zero
void zero()
set zero matrix
Definition: diag_mat.h:268
cgv::math::diag_mat::diag_mat
diag_mat(unsigned n, const T &c)
creates nxn diagonal matrix and set all diagonal elements to c
Definition: diag_mat.h:85
cgv
the cgv namespace
Definition: vr_calib.cxx:9
cgv::math::diag_mat::is_square
bool is_square()
returns true because diagonal matrices are always square
Definition: diag_mat.h:202
cgv::math::diag_mat::exchange_diagonal_elements
void exchange_diagonal_elements(unsigned i, unsigned j)
exchange diagonal elements i and j
Definition: diag_mat.h:183
cgv::math::diag_mat::operator-
diag_mat< T > operator-(const diag_mat< T > &d) const
subtraction of diagonal matrix
Definition: diag_mat.h:313
cgv::math::diag_mat::identity
void identity()
set diagonal matrix to identity
Definition: diag_mat.h:163
cgv::math::diag_mat::operator*
diag_mat< T > operator*(const T &s) const
multiplication with scalar s
Definition: diag_mat.h:297