cgv
tri_diag_mat.h
1 #pragma once
2 #include <cgv/math/vec.h>
3 #include <cgv/math/mat.h>
4 
5 namespace cgv {
6  namespace math {
7 
8 
12 template<typename T>
14 {
15 protected:
16  vec<T> _data;
17 
18  unsigned _dim;
19 
20 public:
23  {
24  _dim=0;
25  }
26 
27  tri_diag_mat(unsigned n)
28  {
29  resize(n);
30  }
31 
32 
33  tri_diag_mat(unsigned n,const T& c)
34  {
35  resize(n);
36  fill(c);
37  }
38 
41  {
42  _data = m._data;
43  _dim = m._dim;
44  }
45 
48  {
49  _data = m._data;
50  _dim = m._dim;
51  return *this;
52  }
53 
55  operator const mat<T>() const
56  {
57  mat<T> m;
58  m.zeros(_dim,_dim);
59 
60  for(int b = -1;b <= 1;b++)
61  for(unsigned i =0; i < _dim;i++)
62  {
63  if(b== -1 && i==0)
64  continue;
65  if(b== 1 && i==_dim-1)
66  continue;
67 
68  m(i,b+i)=operator()(i,b);
69  }
70 
71  return m;
72  }
73 
75  void identity()
76  {
77 
78  for(unsigned i = 0; i < 3*_dim; i++)
79  {
80  if( i < _dim || i > 2*_dim)
81  _data(i)=0;
82  else
83  _data(i)=1;
84  }
85 
86  }
87 
89  operator T*()
90  {
91  return (T*)_data;
92  }
93 
95  operator const T*() const
96  {
97  return (const T*)_data;
98  }
99 
100  void fill(const T& c)
101  {
102  _data.fill(c);
103  _data(0) = 0;
104  _data(3*_dim-1) =0;
105  }
106 
108  bool is_square()
109  {
110  return true;
111  }
112 
113  //transpose
114  void transpose()
115  {
116 
117  }
118 
119  void zeros()
120  {
121  _data.zeros();
122  }
123 
124  void zeros(unsigned n)
125  {
126  resize(n);
127  zeros();
128  }
129 
130 
131  void resize(unsigned n)
132  {
133  _dim=n;
134  _data.resize(3*n);
135  _data(0) = 0;
136  _data(3*n-1) =0;
137  }
138 
140  unsigned nrows()
141  {
142  return _dim;
143  }
144 
146  unsigned ncols()
147  {
148  return _dim;
149  }
150 
152  unsigned size()
153  {
154  return 3*_dim;
155  }
156 
158  T& operator()(unsigned r,int b)
159  {
160  assert(b >= -1 && b <=1);
161  return _data[ (b+1)*_dim + r];
162  }
163 
165  const T& operator()(unsigned r,int b) const
166  {
167  assert(b >= -1 && b <=1);
168  return _data[ (b+1)*_dim + r];
169  }
170 
171 
172  vec<T> band(int b) const
173  {
174  return _data.sub_vec((b+1)*_dim,_dim);
175  }
176 
177 
178  vec<T> operator*(const vec<T>& v) const
179  {
180  vec<T> r;
181  r.zeros(v.dim());
182 
183  for(unsigned i = 0; i < v.dim(); i++)
184  for(int b = -1; b <= 1;b++)
185  {
186  if((i+b >= 0) && (i + b< v.dim()))
187  r(i) += operator()(i,b)*v(i+b);
188  }
189 
190  return r;
191  }
192 
193 
194 
195 };
196 
197  }
198 }
199 
cgv::math::vec::resize
void resize(unsigned dim)
resize the vector
Definition: vec.h:557
cgv::math::vec::sub_vec
vec< T > sub_vec(unsigned ifrom, unsigned size) const
extracts sub vector beginning at index ifrom with given size
Definition: vec.h:657
cgv::math::tri_diag_mat::is_square
bool is_square()
returns true
Definition: tri_diag_mat.h:108
cgv::math::mat
Definition: mat.h:14
cgv::math::vec
A column vector class.
Definition: fvec.h:13
cgv::math::tri_diag_mat::identity
void identity()
set identity matrix
Definition: tri_diag_mat.h:75
cgv::math::tri_diag_mat::operator=
tri_diag_mat< T > & operator=(const tri_diag_mat< T > &m)
assignment of a matrix with the same element type
Definition: tri_diag_mat.h:47
cgv::math::vec::fill
void fill(const T &v)
fill elements of vector with scalar v
Definition: vec.h:524
cgv::math::tri_diag_mat::operator()
const T & operator()(unsigned r, int b) const
return matrix element in row r of band b
Definition: tri_diag_mat.h:165
cgv::math::vec::zeros
void zeros()
fill the vector with zeros
Definition: vec.h:531
cgv::math::tri_diag_mat
Definition: tri_diag_mat.h:14
cgv::math::tri_diag_mat::nrows
unsigned nrows()
return number of rows
Definition: tri_diag_mat.h:140
cgv::math::tri_diag_mat::size
unsigned size()
return storage size in elements
Definition: tri_diag_mat.h:152
cgv::math::tri_diag_mat::ncols
unsigned ncols()
return number of columns
Definition: tri_diag_mat.h:146
cgv
the cgv namespace
Definition: vr_calib.cxx:9
cgv::math::tri_diag_mat::tri_diag_mat
tri_diag_mat()
standard constructor
Definition: tri_diag_mat.h:22
cgv::math::tri_diag_mat::operator()
T & operator()(unsigned r, int b)
return matrix element in row r of band b
Definition: tri_diag_mat.h:158
cgv::math::tri_diag_mat::tri_diag_mat
tri_diag_mat(const tri_diag_mat< T > &m)
copy constructor
Definition: tri_diag_mat.h:40