| /** -*- c++ -*- \file begin_end.hpp \brief Test the \c begin and \c end operations. */ |
| |
| #include <cmath> |
| #include <boost/numeric/ublas/traits/const_iterator_type.hpp> |
| #include <boost/numeric/ublas/traits/iterator_type.hpp> |
| #include <boost/numeric/ublas/traits/c_array.hpp> |
| #include <boost/numeric/ublas/fwd.hpp> |
| #include <boost/numeric/ublas/matrix.hpp> |
| #include <boost/numeric/ublas/matrix_expression.hpp> |
| #include <boost/numeric/ublas/operation/begin.hpp> |
| #include <boost/numeric/ublas/operation/end.hpp> |
| #include <boost/numeric/ublas/tags.hpp> |
| #include <boost/numeric/ublas/vector.hpp> |
| #include <boost/numeric/ublas/vector_expression.hpp> |
| #include <iostream> |
| #include "libs/numeric/ublas/test/utils.hpp" |
| |
| |
| static const double TOL(1.0e-5); ///< Used for comparing two real numbers. |
| |
| #ifdef BOOST_UBLAS_NO_NESTED_CLASS_RELATION |
| #error "sorry this feature is not supported by your compiler" |
| #endif |
| |
| BOOST_UBLAS_TEST_DEF( test_vector_iteration ) |
| { |
| BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Iteration" ); |
| |
| typedef double value_type; |
| typedef boost::numeric::ublas::vector<value_type> vector_type; |
| |
| vector_type v(5); |
| |
| v(0) = 0.555950; |
| v(1) = 0.108929; |
| v(2) = 0.948014; |
| v(3) = 0.023787; |
| v(4) = 1.023787; |
| |
| |
| vector_type::size_type ix = 0; |
| for ( |
| boost::numeric::ublas::iterator_type<vector_type>::type it = boost::numeric::ublas::begin<vector_type>(v); |
| it != boost::numeric::ublas::end<vector_type>(v); |
| ++it |
| ) { |
| BOOST_UBLAS_DEBUG_TRACE( "*it = " << *it << " ==> " << v(ix) ); |
| BOOST_UBLAS_TEST_CHECK( std::fabs(*it - v(ix)) <= TOL ); |
| ++ix; |
| } |
| } |
| |
| |
| BOOST_UBLAS_TEST_DEF( test_vector_const_iteration ) |
| { |
| BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Const Iteration" ); |
| |
| typedef double value_type; |
| typedef boost::numeric::ublas::vector<value_type> vector_type; |
| |
| vector_type v(5); |
| |
| v(0) = 0.555950; |
| v(1) = 0.108929; |
| v(2) = 0.948014; |
| v(3) = 0.023787; |
| v(4) = 1.023787; |
| |
| |
| vector_type::size_type ix = 0; |
| for ( |
| boost::numeric::ublas::const_iterator_type<vector_type>::type it = boost::numeric::ublas::begin<vector_type>(v); |
| it != boost::numeric::ublas::end<vector_type>(v); |
| ++it |
| ) { |
| BOOST_UBLAS_DEBUG_TRACE( "*it = " << *it << " ==> " << v(ix) ); |
| BOOST_UBLAS_TEST_CHECK( std::fabs(*it - v(ix)) <= TOL ); |
| ++ix; |
| } |
| } |
| |
| |
| BOOST_UBLAS_TEST_DEF( test_row_major_matrix_iteration ) |
| { |
| BOOST_UBLAS_DEBUG_TRACE( "TEST Row-major Matrix Iteration" ); |
| |
| typedef double value_type; |
| typedef boost::numeric::ublas::matrix<value_type, boost::numeric::ublas::row_major> matrix_type; |
| typedef boost::numeric::ublas::iterator_type<matrix_type, boost::numeric::ublas::tag::major>::type outer_iterator_type; |
| typedef boost::numeric::ublas::iterator_type<matrix_type, boost::numeric::ublas::tag::minor>::type inner_iterator_type; |
| |
| matrix_type A(5,4); |
| |
| A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; |
| A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; |
| A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; |
| A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; |
| A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; |
| |
| |
| matrix_type::size_type row(0); |
| for ( |
| outer_iterator_type outer_it = boost::numeric::ublas::begin<boost::numeric::ublas::tag::major>(A); |
| outer_it != boost::numeric::ublas::end<boost::numeric::ublas::tag::major>(A); |
| ++outer_it |
| ) { |
| matrix_type::size_type col(0); |
| |
| for ( |
| inner_iterator_type inner_it = boost::numeric::ublas::begin(outer_it); |
| inner_it != boost::numeric::ublas::end(outer_it); |
| ++inner_it |
| ) { |
| BOOST_UBLAS_DEBUG_TRACE( "*it = " << *inner_it << " ==> " << A(row,col) ); |
| BOOST_UBLAS_TEST_CHECK( std::fabs(*inner_it - A(row,col)) <= TOL ); |
| |
| ++col; |
| } |
| |
| ++row; |
| } |
| } |
| |
| |
| BOOST_UBLAS_TEST_DEF( test_col_major_matrix_iteration ) |
| { |
| BOOST_UBLAS_DEBUG_TRACE( "TEST Column-major Matrix Iteration" ); |
| |
| typedef double value_type; |
| typedef boost::numeric::ublas::matrix<value_type, boost::numeric::ublas::column_major> matrix_type; |
| typedef boost::numeric::ublas::iterator_type<matrix_type, boost::numeric::ublas::tag::major>::type outer_iterator_type; |
| typedef boost::numeric::ublas::iterator_type<matrix_type, boost::numeric::ublas::tag::minor>::type inner_iterator_type; |
| |
| matrix_type A(5,4); |
| |
| A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; |
| A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; |
| A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; |
| A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; |
| A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; |
| |
| |
| matrix_type::size_type col(0); |
| for ( |
| outer_iterator_type outer_it = boost::numeric::ublas::begin<boost::numeric::ublas::tag::major>(A); |
| outer_it != boost::numeric::ublas::end<boost::numeric::ublas::tag::major>(A); |
| ++outer_it |
| ) { |
| matrix_type::size_type row(0); |
| |
| for ( |
| inner_iterator_type inner_it = boost::numeric::ublas::begin(outer_it); |
| inner_it != boost::numeric::ublas::end(outer_it); |
| ++inner_it |
| ) { |
| BOOST_UBLAS_DEBUG_TRACE( "*it = " << *inner_it << " ==> " << A(row,col) ); |
| BOOST_UBLAS_TEST_CHECK( std::fabs(*inner_it - A(row,col)) <= TOL ); |
| |
| ++row; |
| } |
| |
| ++col; |
| } |
| } |
| |
| |
| int main() |
| { |
| BOOST_UBLAS_TEST_BEGIN(); |
| |
| BOOST_UBLAS_TEST_DO( test_vector_iteration ); |
| BOOST_UBLAS_TEST_DO( test_vector_const_iteration ); |
| BOOST_UBLAS_TEST_DO( test_row_major_matrix_iteration ); |
| BOOST_UBLAS_TEST_DO( test_col_major_matrix_iteration ); |
| |
| BOOST_UBLAS_TEST_END(); |
| } |