20 #ifndef _BANDEDMATRIX_ID 21 #define _BANDEDMATRIX_ID "$Id$" 33 typedef unsigned int size_type;
34 typedef T element_type;
38 BandedMatrix (
int N_ = 1,
int nbands_off_diagonal = 0) : bands(0)
40 if (! setup (N_, nbands_off_diagonal))
49 if (! setup (N_, first, last))
59 inline bool setup (
int N_ = 1,
int noff = 0)
61 return setup (N_, -noff, noff);
64 bool setup (
int N_,
int first,
int last)
68 if (first > last || N_ <= 0)
72 if (N_ < abs(first) || N_ < abs(last))
81 nbands = last - first + 1;
82 if (bands)
delete[] bands;
83 bands =
new std::vector<T>[nbands];
85 for (i = 0; i < nbands; ++i)
89 int len = N - (abs(bot + i));
91 bands[i].resize (len);
98 return Copy (*
this, b);
104 for (i = 0; i < nbands; ++i)
106 std::fill_n (bands[i].begin(), bands[i].size(), e);
120 inline bool check_bounds (
int i,
int j,
int &v,
int &e)
const 123 e = (i >= j) ? j : i;
124 return !(v < 0 || v >= nbands ||
125 e < 0 || (unsigned int)e >= bands[v].size());
130 if (a.bands)
delete[] a.bands;
134 a.out_of_bounds = b.out_of_bounds;
135 a.nbands = a.top - a.bot + 1;
136 a.bands =
new std::vector<T>[a.nbands];
138 for (i = 0; i < a.nbands; ++i)
140 a.bands[i] = b.bands[i];
146 T &element (
int i,
int j)
149 if (check_bounds(i, j, v, e))
150 return (bands[v][e]);
152 return out_of_bounds;
155 const T &element (
int i,
int j)
const 158 if (check_bounds(i, j, v, e))
159 return (bands[v][e]);
161 return out_of_bounds;
164 inline T & operator() (
int i,
int j)
166 return element (i-1,j-1);
169 inline const T & operator() (
int i,
int j)
const 171 return element (i-1,j-1);
174 size_type num_rows()
const {
return N; }
176 size_type num_cols()
const {
return N; }
194 std::vector<T> *bands;
202 std::ostream &operator<< (std::ostream &out, const BandedMatrix<T> &m)
205 for (i = 0; i < m.num_rows(); ++i)
207 for (j = 0; j < m.num_cols(); ++j)
209 out << m.element (i, j) <<
" ";
232 typename BandedMatrix<T>::element_type & operator[] (
int j)
237 const typename BandedMatrix<T>::element_type & operator[] (
int j)
const 239 return bm.element (i, j);
252 template <
class Vector,
class Matrix>
253 Vector operator* (
const Matrix &m,
const Vector &v)
255 typename Matrix::size_type M = m.num_rows();
256 typename Matrix::size_type N = m.num_cols();
258 assert (N <= v.size());
263 for (
unsigned int i = 0; i < M; ++i)
265 typename Matrix::element_type sum = 0;
266 for (
unsigned int j = 0; j < N; ++j)
268 sum += m[i][j] * v[j];
283 int LU_factor_banded (MT &A,
unsigned int bands)
285 typename MT::size_type M = A.num_rows();
286 typename MT::size_type N = A.num_cols();
290 typename MT::size_type i,j,k;
291 typename MT::element_type sum;
293 for (j = 1; j <= N; ++j)
300 for (i = (j > bands) ? j-bands : 1; i <= j; ++i)
303 for (k = (j > bands) ? j-bands : 1; k < i; ++k)
305 sum += A(i,k)*A(k,j);
311 for (i = j+1; (i <= M) && (i <= j+bands); ++i)
314 for (k = (i > bands) ? i-bands : 1; k < j; ++k)
316 sum += A(i,k)*A(k,j);
318 A(i,j) = (A(i,j) - sum) / A(j,j);
333 template <
class MT,
class Vector>
334 int LU_solve_banded(
const MT &A, Vector &b,
unsigned int bands)
336 typename MT::size_type i,j;
337 typename MT::size_type M = A.num_rows();
338 typename MT::size_type N = A.num_cols();
339 typename MT::element_type sum;
341 if (M != N || M == 0)
346 for (i = 2; i <= M; ++i)
349 for (j = (i > bands) ? i-bands : 1; j < i; ++j)
351 sum -= A(i,j)*b[j-1];
358 for (i = M-1; i >= 1; --i)
363 for (j = i+1; (j <= N) && (j <= i+bands); ++j)
365 sum -= A(i,j)*b[j-1];
367 b[i-1] = sum / A(i,i);
Definition: BandedMatrix.h:30
Definition: BSplineBase.cpp:55
Definition: BandedMatrix.h:27