1 | // Copyright (c) 2011 David Bellot |
2 | // |
3 | // Distributed under the Boost Software License, Version 1.0. (See |
4 | // accompanying file LICENSE_1_0.txt or copy at |
5 | // http://www.boost.org/LICENSE_1_0.txt) |
6 | |
7 | #include <cmath> |
8 | #include <boost/numeric/ublas/traits/const_iterator_type.hpp> |
9 | #include <boost/numeric/ublas/traits/iterator_type.hpp> |
10 | #include <boost/numeric/ublas/traits/c_array.hpp> |
11 | #include <boost/numeric/ublas/fwd.hpp> |
12 | #include <boost/numeric/ublas/matrix.hpp> |
13 | #include <boost/numeric/ublas/matrix_expression.hpp> |
14 | #include <boost/numeric/ublas/operation/begin.hpp> |
15 | #include <boost/numeric/ublas/operation/end.hpp> |
16 | #include <boost/numeric/ublas/tags.hpp> |
17 | #include <boost/numeric/ublas/vector.hpp> |
18 | #include <boost/numeric/ublas/vector_expression.hpp> |
19 | #include <iostream> |
20 | #include "utils.hpp" |
21 | |
22 | |
23 | static const double TOL(1.0e-5); ///< Used for comparing two real numbers. |
24 | |
25 | #ifdef BOOST_UBLAS_NO_NESTED_CLASS_RELATION |
26 | #error "sorry this feature is not supported by your compiler" |
27 | #endif |
28 | |
29 | BOOST_UBLAS_TEST_DEF( test_vector_iteration ) |
30 | { |
31 | BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Iteration" ); |
32 | |
33 | typedef double value_type; |
34 | typedef boost::numeric::ublas::vector<value_type> vector_type; |
35 | |
36 | vector_type v(5); |
37 | |
38 | v(0) = 0.555950; |
39 | v(1) = 0.108929; |
40 | v(2) = 0.948014; |
41 | v(3) = 0.023787; |
42 | v(4) = 1.023787; |
43 | |
44 | |
45 | vector_type::size_type ix = 0; |
46 | for ( |
47 | boost::numeric::ublas::iterator_type<vector_type>::type it = boost::numeric::ublas::begin<vector_type>(e&: v); |
48 | it != boost::numeric::ublas::end<vector_type>(e&: v); |
49 | ++it |
50 | ) { |
51 | BOOST_UBLAS_DEBUG_TRACE( "*it = " << *it << " ==> " << v(ix) ); |
52 | BOOST_UBLAS_TEST_CHECK( std::abs(*it - v(ix)) <= TOL ); |
53 | ++ix; |
54 | } |
55 | } |
56 | |
57 | |
58 | BOOST_UBLAS_TEST_DEF( test_vector_const_iteration ) |
59 | { |
60 | BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Const Iteration" ); |
61 | |
62 | typedef double value_type; |
63 | typedef boost::numeric::ublas::vector<value_type> vector_type; |
64 | |
65 | vector_type v(5); |
66 | |
67 | v(0) = 0.555950; |
68 | v(1) = 0.108929; |
69 | v(2) = 0.948014; |
70 | v(3) = 0.023787; |
71 | v(4) = 1.023787; |
72 | |
73 | |
74 | vector_type::size_type ix = 0; |
75 | for ( |
76 | boost::numeric::ublas::const_iterator_type<vector_type>::type it = boost::numeric::ublas::begin<vector_type>(e&: v); |
77 | it != boost::numeric::ublas::end<vector_type>(e&: v); |
78 | ++it |
79 | ) { |
80 | BOOST_UBLAS_DEBUG_TRACE( "*it = " << *it << " ==> " << v(ix) ); |
81 | BOOST_UBLAS_TEST_CHECK( std::abs(*it - v(ix)) <= TOL ); |
82 | ++ix; |
83 | } |
84 | } |
85 | |
86 | |
87 | BOOST_UBLAS_TEST_DEF( test_row_major_matrix_iteration ) |
88 | { |
89 | BOOST_UBLAS_DEBUG_TRACE( "TEST Row-major Matrix Iteration" ); |
90 | |
91 | typedef double value_type; |
92 | typedef boost::numeric::ublas::matrix<value_type, boost::numeric::ublas::row_major> matrix_type; |
93 | typedef boost::numeric::ublas::iterator_type<matrix_type, boost::numeric::ublas::tag::major>::type outer_iterator_type; |
94 | typedef boost::numeric::ublas::iterator_type<matrix_type, boost::numeric::ublas::tag::minor>::type inner_iterator_type; |
95 | |
96 | matrix_type A(5,4); |
97 | |
98 | A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; |
99 | A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; |
100 | A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; |
101 | A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; |
102 | A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; |
103 | |
104 | |
105 | matrix_type::size_type row(0); |
106 | for ( |
107 | outer_iterator_type outer_it = boost::numeric::ublas::begin<boost::numeric::ublas::tag::major>(e&: A); |
108 | outer_it != boost::numeric::ublas::end<boost::numeric::ublas::tag::major>(e&: A); |
109 | ++outer_it |
110 | ) { |
111 | matrix_type::size_type col(0); |
112 | |
113 | for ( |
114 | inner_iterator_type inner_it = boost::numeric::ublas::begin(it&: outer_it); |
115 | inner_it != boost::numeric::ublas::end(it&: outer_it); |
116 | ++inner_it |
117 | ) { |
118 | BOOST_UBLAS_DEBUG_TRACE( "*it = " << *inner_it << " ==> " << A(row,col) ); |
119 | BOOST_UBLAS_TEST_CHECK( std::abs(*inner_it - A(row,col)) <= TOL ); |
120 | |
121 | ++col; |
122 | } |
123 | |
124 | ++row; |
125 | } |
126 | } |
127 | |
128 | |
129 | BOOST_UBLAS_TEST_DEF( test_col_major_matrix_iteration ) |
130 | { |
131 | BOOST_UBLAS_DEBUG_TRACE( "TEST Column-major Matrix Iteration" ); |
132 | |
133 | typedef double value_type; |
134 | typedef boost::numeric::ublas::matrix<value_type, boost::numeric::ublas::column_major> matrix_type; |
135 | typedef boost::numeric::ublas::iterator_type<matrix_type, boost::numeric::ublas::tag::major>::type outer_iterator_type; |
136 | typedef boost::numeric::ublas::iterator_type<matrix_type, boost::numeric::ublas::tag::minor>::type inner_iterator_type; |
137 | |
138 | matrix_type A(5,4); |
139 | |
140 | A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; |
141 | A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; |
142 | A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; |
143 | A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; |
144 | A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; |
145 | |
146 | |
147 | matrix_type::size_type col(0); |
148 | for ( |
149 | outer_iterator_type outer_it = boost::numeric::ublas::begin<boost::numeric::ublas::tag::major>(e&: A); |
150 | outer_it != boost::numeric::ublas::end<boost::numeric::ublas::tag::major>(e&: A); |
151 | ++outer_it |
152 | ) { |
153 | matrix_type::size_type row(0); |
154 | |
155 | for ( |
156 | inner_iterator_type inner_it = boost::numeric::ublas::begin(it&: outer_it); |
157 | inner_it != boost::numeric::ublas::end(it&: outer_it); |
158 | ++inner_it |
159 | ) { |
160 | BOOST_UBLAS_DEBUG_TRACE( "*it = " << *inner_it << " ==> " << A(row,col) ); |
161 | BOOST_UBLAS_TEST_CHECK( std::abs(*inner_it - A(row,col)) <= TOL ); |
162 | |
163 | ++row; |
164 | } |
165 | |
166 | ++col; |
167 | } |
168 | } |
169 | |
170 | |
171 | int main() |
172 | { |
173 | BOOST_UBLAS_TEST_BEGIN(); |
174 | |
175 | BOOST_UBLAS_TEST_DO( test_vector_iteration ); |
176 | BOOST_UBLAS_TEST_DO( test_vector_const_iteration ); |
177 | BOOST_UBLAS_TEST_DO( test_row_major_matrix_iteration ); |
178 | BOOST_UBLAS_TEST_DO( test_col_major_matrix_iteration ); |
179 | |
180 | BOOST_UBLAS_TEST_END(); |
181 | } |
182 | |