20 #ifndef _BANDEDMATRIX_ID
21 #define _BANDEDMATRIX_ID "$Id$"
32 typedef unsigned int size_type;
33 typedef T element_type;
39 if (!setup(N_, nbands_off_diagonal))
48 if (!setup(N_, first, last))
53 setup(
int N_ = 1,
int noff = 0)
55 return setup(N_, -noff, noff);
59 setup(
int N_,
int first,
int last)
63 if (first > last || N_ <= 0)
67 if (N_ < abs(first) || N_ < abs(last))
76 nbands = last - first + 1;
79 for (i = 0; i < nbands; ++i)
83 int len = N - (abs(bot + i));
94 for (i = 0; i < nbands; ++i)
96 std::fill_n(bands[i].begin(), bands[i].size(), e);
108 check_bounds(
int i,
int j,
int& v,
int& e)
const
111 e = (i >= j) ? j : i;
112 return !(v < 0 || v >= nbands || e < 0 ||
113 (
unsigned int)e >= bands[v].size());
118 element(
int i,
int j)
121 if (check_bounds(i, j, v, e))
122 return (bands[v][e]);
124 return out_of_bounds;
128 element(
int i,
int j)
const
131 if (check_bounds(i, j, v, e))
132 return (bands[v][e]);
134 return out_of_bounds;
138 operator()(
int i,
int j)
140 return element(i - 1, j - 1);
144 operator()(
int i,
int j)
const
146 return element(i - 1, j - 1);
162 operator[](
int row)
const
175 typedef std::vector<T> diagonal_t;
180 std::vector<diagonal_t> bands;
190 for (i = 0; i < m.num_rows(); ++i)
192 for (j = 0; j < m.num_cols(); ++j)
194 out << m.element(i, j) <<
" ";
211 typename BandedMatrix<T>::element_type&
217 const typename BandedMatrix<T>::element_type&
218 operator[](
int j)
const
220 return bm.element(i, j);
232 template <
class Vector,
class Matrix>
234 operator*(
const Matrix& m,
const Vector& v)
236 typename Matrix::size_type M = m.num_rows();
237 typename Matrix::size_type N = m.num_cols();
239 assert(N <= v.size());
244 for (
unsigned int i = 0; i < M; ++i)
246 typename Matrix::element_type sum = 0;
247 for (
unsigned int j = 0; j < N; ++j)
249 sum += m[i][j] * v[j];
263 LU_factor_banded(MT& A,
unsigned int bands)
265 typename MT::size_type M = A.num_rows();
266 typename MT::size_type N = A.num_cols();
270 typename MT::size_type i, j, k;
271 typename MT::element_type sum;
273 for (j = 1; j <= N; ++j)
280 for (i = (j > bands) ? j - bands : 1; i <= j; ++i)
283 for (k = (j > bands) ? j - bands : 1; k < i; ++k)
285 sum += A(i, k) * A(k, j);
291 for (i = j + 1; (i <= M) && (i <= j + bands); ++i)
294 for (k = (i > bands) ? i - bands : 1; k < j; ++k)
296 sum += A(i, k) * A(k, j);
298 A(i, j) = (A(i, j) - sum) / A(j, j);
311 template <
class MT,
class Vector>
313 LU_solve_banded(
const MT& A, Vector& b,
unsigned int bands)
315 typename MT::size_type i, j;
316 typename MT::size_type M = A.num_rows();
317 typename MT::size_type N = A.num_cols();
318 typename MT::element_type sum;
320 if (M != N || M == 0)
325 for (i = 2; i <= M; ++i)
328 for (j = (i > bands) ? i - bands : 1; j < i; ++j)
330 sum -= A(i, j) * b[j - 1];
337 for (i = M - 1; i >= 1; --i)
342 for (j = i + 1; (j <= N) && (j <= i + bands); ++j)
344 sum -= A(i, j) * b[j - 1];
346 b[i - 1] = sum / A(i, i);
Definition: BandedMatrix.h:205
Definition: BandedMatrix.h:30
Definition: BSplineBase.cpp:57