00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MTL_MATRIX_MULTI_VECTOR_RANGE_INCLUDE
00013 #define MTL_MATRIX_MULTI_VECTOR_RANGE_INCLUDE
00014
00015 #include <boost/numeric/mtl/matrix/multi_vector.hpp>
00016
00017 namespace mtl { namespace matrix {
00018
00019
00020
00021 template <typename Vector>
00022 class multi_vector_range
00023 {
00024 typedef multi_vector<Vector> ref_type;
00025 typedef multi_vector_range self;
00026 typedef typename Collection<Vector>::size_type size_type;
00027
00028 public:
00029
00030 multi_vector_range(ref_type& ref, irange const& r)
00031 : ref(ref), range(intersection(r, irange(0, num_cols(ref)))) {} {}
00032
00033
00035 friend size_type num_cols(const self& A) { return range.size(); }
00037 friend size_type num_rows(const self& A) { return num_rows(ref); }
00038
00039 const_reference operator() (size_type i, size_type j) const { return data[j][i+range.start()]; }
00040 reference operator() (size_type i, size_type j) { return data[j][i+range.start()]; }
00041
00042 Vector& vector(size_type i) { return data[i+range.start()]; }
00043 const Vector& vector(size_type i) const { return data[i+range.start()]; }
00044
00045 private:
00046 ref_type& ref;
00047 irange range;
00048 };
00049
00050
00051
00052 }}
00053
00054 #endif // MTL_MATRIX_MULTI_VECTOR_RANGE_INCLUDE