29 #if !defined(FEELPP_MATRIX_HPP)
30 #define FEELPP_MATRIX_HPP 1
32 #include <boost/numeric/ublas/vector.hpp>
33 #include <boost/numeric/ublas/matrix_expression.hpp>
34 #include <boost/numeric/ublas/detail/matrix_assign.hpp>
46 class anti_identity_matrix:
47 public matrix_container<anti_identity_matrix<T> >
50 typedef const T *const_pointer;
51 typedef anti_identity_matrix<T> self_type;
53 #ifdef BOOST_UBLAS_ENABLE_PROXY_SHORTCUTS
54 using matrix_container<self_type>::operator ();
57 typedef std::ptrdiff_t difference_type;
59 typedef const T &const_reference;
61 typedef const matrix_reference<const self_type> const_closure_type;
62 typedef matrix_reference<self_type> closure_type;
63 typedef sparse_tag storage_category;
64 typedef unknown_orientation_tag orientation_category;
68 anti_identity_matrix ():
69 matrix_container<self_type> (),
70 size1_ ( 0 ), size2_ ( 0 ), size_common_ ( 0 ) {}
72 anti_identity_matrix ( size_type size ):
73 matrix_container<self_type> (),
74 size1_ ( size ), size2_ ( size ), size_common_ ( ( std::min ) ( size1_, size2_ ) ) {}
76 anti_identity_matrix ( size_type size1, size_type size2 ):
77 matrix_container<self_type> (),
78 size1_ ( size1 ), size2_ ( size2 ), size_common_ ( ( std::min ) ( size1_, size2_ ) ) {}
80 anti_identity_matrix (
const anti_identity_matrix &m ):
81 matrix_container<self_type> (),
82 size1_ ( m.size1_ ), size2_ ( m.size2_ ), size_common_ ( ( std::min ) ( size1_, size2_ ) ) {}
98 void resize ( size_type size,
bool preserve =
true )
104 void resize ( size_type size1, size_type size2,
bool =
true )
112 const_reference operator () ( size_type i, size_type j )
const
114 if ( i == size2_-( j+1 ) )
123 anti_identity_matrix &
operator = (
const anti_identity_matrix &m )
130 anti_identity_matrix &assign_temporary ( anti_identity_matrix &m )
138 void swap ( anti_identity_matrix &m )
142 std::swap ( size1_, m.size1_ );
143 std::swap ( size2_, m.size2_ );
147 friend void swap ( anti_identity_matrix &m1, anti_identity_matrix &m2 )
155 typedef size_type const_subiterator_type;
158 class const_iterator1;
159 class const_iterator2;
160 typedef reverse_iterator_base1<const_iterator1> const_reverse_iterator1;
161 typedef reverse_iterator_base2<const_iterator2> const_reverse_iterator2;
165 const_iterator1 find1 (
int rank, size_type i, size_type j )
const
169 i = ( std::max ) ( i, j );
170 i = ( std::min ) ( i, j + 1 );
173 return const_iterator1 ( *
this, i );
176 const_iterator2 find2 (
int rank, size_type i, size_type j )
const
180 j = ( std::max ) ( j, i );
181 j = ( std::min ) ( j, i + 1 );
184 return const_iterator2 ( *
this, j );
188 class const_iterator1:
189 public container_const_reference<anti_identity_matrix>,
190 public bidirectional_iterator_base<sparse_bidirectional_iterator_tag,
191 const_iterator1, value_type>
194 typedef typename anti_identity_matrix::value_type value_type;
195 typedef typename anti_identity_matrix::difference_type difference_type;
196 typedef typename anti_identity_matrix::const_reference reference;
197 typedef typename anti_identity_matrix::const_pointer pointer;
199 typedef const_iterator2 dual_iterator_type;
200 typedef const_reverse_iterator2 dual_reverse_iterator_type;
205 container_const_reference<self_type> (), it_ () {}
207 const_iterator1 (
const self_type &m,
const const_subiterator_type &it ):
208 container_const_reference<self_type> ( m ), it_ ( it ) {}
212 const_iterator1 &operator ++ ()
214 BOOST_UBLAS_CHECK ( it_ < ( *
this ) ().size1 (), bad_index () );
219 const_iterator1 &operator -- ()
221 BOOST_UBLAS_CHECK ( it_ > 0, bad_index () );
228 const_reference operator * ()
const
233 #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
235 #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION
238 const_iterator2 begin ()
const
240 return const_iterator2 ( ( *
this ) (), it_ );
243 #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION
246 const_iterator2 end ()
const
248 return const_iterator2 ( ( *
this ) (), it_ + 1 );
251 #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION
254 const_reverse_iterator2 rbegin ()
const
256 return const_reverse_iterator2 ( end () );
259 #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION
262 const_reverse_iterator2 rend ()
const
264 return const_reverse_iterator2 ( begin () );
282 const_iterator1 &
operator = (
const const_iterator1 &it )
284 container_const_reference<self_type>::assign ( &it () );
291 bool operator == (
const const_iterator1 &it )
const
293 BOOST_UBLAS_CHECK ( &( *
this ) () == &it (), external_logic () );
294 return it_ == it.it_;
298 const_subiterator_type it_;
301 typedef const_iterator1 iterator1;
304 const_iterator1 begin1 ()
const
306 return const_iterator1 ( *
this, 0 );
309 const_iterator1 end1 ()
const
311 return const_iterator1 ( *
this, size_common_ );
314 class const_iterator2:
315 public container_const_reference<anti_identity_matrix>,
316 public bidirectional_iterator_base<sparse_bidirectional_iterator_tag,
317 const_iterator2, value_type>
320 typedef typename anti_identity_matrix::value_type value_type;
321 typedef typename anti_identity_matrix::difference_type difference_type;
322 typedef typename anti_identity_matrix::const_reference reference;
323 typedef typename anti_identity_matrix::const_pointer pointer;
325 typedef const_iterator1 dual_iterator_type;
326 typedef const_reverse_iterator1 dual_reverse_iterator_type;
331 container_const_reference<self_type> (), it_ () {}
333 const_iterator2 (
const self_type &m,
const const_subiterator_type &it ):
334 container_const_reference<self_type> ( m ), it_ ( it ) {}
338 const_iterator2 &operator ++ ()
340 BOOST_UBLAS_CHECK ( it_ < ( *
this ) ().size_common_, bad_index () );
345 const_iterator2 &operator -- ()
347 BOOST_UBLAS_CHECK ( it_ > 0, bad_index () );
354 const_reference operator * ()
const
359 #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
361 #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION
364 const_iterator1 begin ()
const
366 return const_iterator1 ( ( *
this ) (), it_ );
369 #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION
372 const_iterator1 end ()
const
374 return const_iterator1 ( ( *
this ) (), it_ + 1 );
377 #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION
380 const_reverse_iterator1 rbegin ()
const
382 return const_reverse_iterator1 ( end () );
385 #ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION
388 const_reverse_iterator1 rend ()
const
390 return const_reverse_iterator1 ( begin () );
408 const_iterator2 &
operator = (
const const_iterator2 &it )
410 container_const_reference<self_type>::assign ( &it () );
417 bool operator == (
const const_iterator2 &it )
const
419 BOOST_UBLAS_CHECK ( &( *
this ) () == &it (), external_logic () );
420 return it_ == it.it_;
424 const_subiterator_type it_;
427 typedef const_iterator2 iterator2;
430 const_iterator2 begin2 ()
const
432 return const_iterator2 ( *
this, 0 );
435 const_iterator2 end2 ()
const
437 return const_iterator2 ( *
this, size_common_ );
443 const_reverse_iterator1 rbegin1 ()
const
445 return const_reverse_iterator1 ( end1 () );
448 const_reverse_iterator1 rend1 ()
const
450 return const_reverse_iterator1 ( begin1 () );
454 const_reverse_iterator2 rbegin2 ()
const
456 return const_reverse_iterator2 ( end2 () );
459 const_reverse_iterator2 rend2 ()
const
461 return const_reverse_iterator2 ( begin2 () );
468 static const value_type zero_;
469 static const value_type one_;
473 const typename anti_identity_matrix<T>::value_type anti_identity_matrix<T>::zero_ ( 0 );
475 const typename anti_identity_matrix<T>::value_type anti_identity_matrix<T>::one_ ( 1 );