cgv
Loading...
Searching...
No Matches
diag_mat.h
1#pragma once
2
3#include "vec.h"
4#include "mat.h"
5#include "up_tri_mat.h"
6
7namespace cgv{
8 namespace math{
9
14template <typename T>
15struct diag_mat
16{
17
18public:
21public:
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 T* data()
125 {
126 return _data.data();
127 }
128
130 const T* data() const
131 {
132 return _data.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
201 const T& operator[] (unsigned i) const
202 {
203 return _data[i];
204 }
205
207 T& operator[] (unsigned i)
208 {
209 return _data[i];
210 }
211
212
215 {
216 return true;
217 }
218
219 //transpose (does nothing)
220 void transpose(){}
221
222
225 {
226 _data =m._data;
227 return *this;
228 }
229
231 template <typename S>
233 {
234 resize(m.size());
235 for(unsigned i = 0; i < size(); i++)
236 _data[i]=(T)m(i);
237 return *this;
238 }
239
242 template <typename S>
244 {
245 _data=v;
246 return *this;
247 }
248
251 {
252 fill (s);
253 return *this;
254 }
257 {
258 T n=0;
259 for(int i =0; i < size();i++)
260 n+=_data[i]*_data[i];
261
262 return (T)sqrt((double)n);
263 }
264
265
266
267
269 void identity(unsigned dim)
270 {
271 resize(dim);
272 for(unsigned i = 0; i < size();++i)
273 _data[i]=1;
274 }
275
277 void zero()
278 {
279 fill(0);
280 }
281
284 {
285 assert(d.nrows() == nrows());
286 _data += d._data;
287 return *this;
288 }
289
292 {
293 assert(d.nrows() == nrows());
294 _data -= d._data;
295 return *this;
296 }
297
300 {
301 _data *=s;
302 return *this;
303 }
304
306 diag_mat<T> operator*(const T& s) const
307 {
308 diag_mat<T> r=*this;
309 r*=s;
310 return r;
311 }
312
315 {
316 diag_mat<T> r=*this;
317 r += d;
318 return r;
319 }
320
323 {
324 diag_mat<T>r = *this;
325 r-= d;
326 return r;
327 }
328
329
330
332 vec<T> operator*(const vec<T>& v) const
333 {
334 assert(v.dim() == ncols());
335 vec<T> r(size());
336 for(unsigned i = 0; i < size();i++)
337 r(i) = _data[i]*v(i);
338 return r;
339 }
340
343 {
344 assert(m.nrows() == size());
345
346 up_tri_mat<T> r(size());
347
348 for(unsigned i = 0; i < size(); i++)
349 for(unsigned j = 0; j < m.ncols();j++)
350 r(i,j) = operator()(i)*m(i,j);
351
352 return r;
353 }
354
356 operator mat<T>()
357 {
358 mat<T> m(size(),size(),(T)0);
359 for(unsigned i = 0; i < size();i++)
360 {
361 m(i,i)=_data[i];
362 }
363 return m;
364 }
365
366};
367
368//matrix multiplication of matrix m by a diagonal matrix s
369template <typename T, typename S>
370const mat<T> operator*(const mat<T>& m,const diag_mat<S>& s)
371{
372 assert(m.ncols() == s.size());
373 mat<T> r(m.nrows(),s.size());
374 for(unsigned i = 0; i < m.nrows(); i++)
375 for(unsigned j = 0; j < s.size();j++)
376 r(i,j) = s(j)*m(i,j);
377
378 return r;
379}
380
382template <typename T>
383const diag_mat<T> operator*(const T& s, const diag_mat<T>& m)
384{
385 return m*s;
386}
387
389template <typename T, typename S>
390const diag_mat<T> operator*(const diag_mat<S>& s, const diag_mat<T>& m)
391{
392 assert(m.size() == s.size());
393
394 diag_mat<T> r(s.size());
395
396 for(unsigned i = 0; i < s.size(); i++)
397 r(i) = s(i)*m(i);
398
399 return r;
400}
402template<typename T>
403mat<T> operator*(const perm_mat& p, const diag_mat<T>& m)
404{
405 mat<T> r=m;
406 return p*r;
407}
408
410template<typename T>
411mat<T> operator*(const diag_mat<T>& m,const perm_mat& p)
412{
413 mat<T> r=m;
414 return r*p;
415}
416
418template <typename T>
419const mat<T> operator*(const diag_mat<T>& s, const mat<T>& m)
420{
421 assert(m.nrows() == s.size());
422
423 mat<T> r(s.size(),m.ncols());
424
425 for(unsigned i = 0; i < s.size(); i++)
426 for(unsigned j = 0; j < m.ncols();j++)
427 r(i,j) = s(i)*m(i,j);
428
429 return r;
430}
431
433template <typename T>
434const up_tri_mat<T> operator*(const up_tri_mat<T>& m,const diag_mat<T>& s)
435{
436 assert(m.ncols() == s.size());
437 up_tri_mat<T> r(s.size());
438 for(unsigned i = 0; i < m.nrows(); i++)
439 for(unsigned j = i; j < s.size();j++)
440 r(i,j) = s(j)*m(i,j);
441
442 return r;
443}
444
445
446
447
448
450template <typename T>
451std::ostream& operator<<(std::ostream& out, const diag_mat<T>& m)
452{
453
454 for (int i=0;i<(int)m.size();++i)
455 out << m(i)<<" ";
456
457 return out;
458}
459
461template <typename T>
462std::istream& operator>>(std::istream& in, diag_mat<T>& m)
463{
464 assert(m.size() > 0);
465 for (int i=0;i<(int)m.size();++i)
466 in >> m(i);
467
468 return in;
469}
470
471
472}
473}
A matrix type (full column major storage) The matrix can be loaded directly into OpenGL without need ...
Definition mat.h:208
unsigned ncols() const
number of columns
Definition mat.h:546
void resize(unsigned rows, unsigned cols)
resize the matrix, the content of the matrix will be destroyed
Definition mat.h:574
void zeros()
set zero matrix
Definition mat.h:1030
unsigned nrows() const
number of rows
Definition mat.h:540
A column vector class.
Definition vec.h:28
unsigned dim() const
number of elements
Definition vec.h:61
the cgv namespace
Definition print.h:11
std::ostream & operator<<(std::ostream &os, const vr_device_info &di)
stream out operator for device infos
Definition vr_info.cxx:10
A diagonal matrix type which internally stores the elements on the main diagonal in a vector.
Definition diag_mat.h:16
diag_mat(unsigned n, const T &c)
creates nxn diagonal matrix and set all diagonal elements to c
Definition diag_mat.h:85
diag_mat< T > operator+(const diag_mat< T > &d) const
addition of diagonal matrix
Definition diag_mat.h:314
bool is_square()
returns true because diagonal matrices are always square
Definition diag_mat.h:214
diag_mat< T > operator*(const T &s) const
multiplication with scalar s
Definition diag_mat.h:306
unsigned ncols() const
number of columns
Definition diag_mat.h:69
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
void zero()
set zero matrix
Definition diag_mat.h:277
const T & operator()(unsigned i) const
const access to the ith diagonal element
Definition diag_mat.h:189
diag_mat(const diag_mat< T > &m)
copy constructor
Definition diag_mat.h:111
T * data()
cast into array of element type
Definition diag_mat.h:124
T frobenius_norm() const
returns the frobenius norm of matrix m
Definition diag_mat.h:256
diag_mat< T > & operator+=(const diag_mat< T > &d)
in place addition of diagonal matrix
Definition diag_mat.h:283
diag_mat< T > & operator-=(const diag_mat< T > &d)
in place subtraction of diagonal matrix
Definition diag_mat.h:291
unsigned size() const
size of storage
Definition diag_mat.h:57
diag_mat< T > operator-(const diag_mat< T > &d) const
subtraction of diagonal matrix
Definition diag_mat.h:322
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
const T & operator[](unsigned i) const
const access to the ith diagonal element
Definition diag_mat.h:201
void identity(unsigned dim)
set dim x dim identity matrix
Definition diag_mat.h:269
const T * data() const
cast into array of const element type
Definition diag_mat.h:130
virtual ~diag_mat()
destructor
Definition diag_mat.h:119
diag_mat()
standard constructor
Definition diag_mat.h:75
diag_mat(const vec< T > &dv)
creates a diagonal matrix and set the diagonal vector to dv
Definition diag_mat.h:97
diag_mat< T > & operator*=(const T &s)
in place multiplication with scalar s
Definition diag_mat.h:299
diag_mat(unsigned n)
creates nxn diagonal matrix
Definition diag_mat.h:80
void identity()
set diagonal matrix to identity
Definition diag_mat.h:163
void exchange_diagonal_elements(unsigned i, unsigned j)
exchange diagonal elements i and j
Definition diag_mat.h:183
vec< T > _data
pointer to data storage
Definition diag_mat.h:20
diag_mat< T > & operator=(const diag_mat< T > &m)
assignment of a matrix with the same element type
Definition diag_mat.h:224
vec< T > operator*(const vec< T > &v) const
multiplication with vector
Definition diag_mat.h:332
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:342
void zeros()
fills all diagonal entries with zero
Definition diag_mat.h:177
void fill(const T &c)
fills all diagonal entries with c
Definition diag_mat.h:169
unsigned nrows() const
number of rows
Definition diag_mat.h:63