cgv
Loading...
Searching...
No Matches
tri_diag_mat.h
1#pragma once
2#include <cgv/math/vec.h>
3#include <cgv/math/mat.h>
4
5namespace cgv {
6 namespace math {
7
8
12template<typename T>
14{
15protected:
16 vec<T> _data;
17
18 unsigned _dim;
19
20public:
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
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
A matrix type (full column major storage) The matrix can be loaded directly into OpenGL without need ...
Definition mat.h:208
void zeros()
set zero matrix
Definition mat.h:1030
tridiagonal matrix (square)
tri_diag_mat< T > & operator=(const tri_diag_mat< T > &m)
assignment of a matrix with the same element type
tri_diag_mat()
standard constructor
T & operator()(unsigned r, int b)
return matrix element in row r of band b
bool is_square()
returns true
unsigned ncols()
return number of columns
tri_diag_mat(const tri_diag_mat< T > &m)
copy constructor
unsigned size()
return storage size in elements
unsigned nrows()
return number of rows
void identity()
set identity matrix
const T & operator()(unsigned r, int b) const
return matrix element in row r of band b
A column vector class.
Definition vec.h:28
void fill(const T &v)
fill elements of vector with scalar v
Definition vec.h:463
void resize(unsigned dim)
resize the vector
Definition vec.h:496
vec< T > sub_vec(unsigned ifrom, unsigned size) const
extracts sub vector beginning at index ifrom with given size
Definition vec.h:607
void zeros()
fill the vector with zeros
Definition vec.h:470
the cgv namespace
Definition print.h:11