2 // Copyright (c) 2000-2002
3 // Joerg Walter, Mathias Koch
5 // Distributed under the Boost Software License, Version 1.0. (See
6 // accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // The authors gratefully acknowledge the support of
10 // GeNeSys mbH & Co. KG in producing this work.
13 #if defined(__GNUC__) && (__GNUC__ >= 9)
14 #pragma GCC diagnostic ignored "-Wdeprecated-copy"
19 // Test matrix & vector expression templates
20 template <class V, class M, int N>
21 struct test_my_matrix_vector
23 typedef typename V::value_type value_type;
25 template <class VP, class MP>
26 void test_with(VP& v1, VP& v2, MP& m1) const
31 initialize_matrix(m1);
32 for (int i = 0; i < N; ++i)
34 v2 = ublas::row(m1, i);
35 std::cout << "row (m, " << i << ") = " << v2 << std::endl;
36 v2 = ublas::column(m1, i);
37 std::cout << "column (m, " << i << ") = " << v2 << std::endl;
41 initialize_vector(v1);
42 initialize_vector(v2);
45 m1 = ublas::outer_prod(v1, v2);
46 std::cout << "outer_prod (v1, v2) = " << m1 << std::endl;
48 // Matrix vector product
49 initialize_matrix(m1);
50 initialize_vector(v1);
51 v2 = ublas::prod(m1, v1);
52 std::cout << "prod (m1, v1) = " << v2 << std::endl;
53 v2 = ublas::prod(v1, m1);
54 std::cout << "prod (v1, m1) = " << v2 << std::endl;
58 void operator()() const
68 test_with(v1, v2, m1);
70 ublas::matrix_row<M> mr1(m1, 1), mr2(m1, 1);
71 test_with(mr1, mr2, m1);
73 ublas::matrix_column<M> mc1(m1, 1), mc2(m1, 1);
74 test_with(mc1, mc2, m1);
77 ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),
78 mvr2(m1, ublas::range(0, N), ublas::range(0, N));
79 test_with(mvr1, mvr2, m1);
83 ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
84 mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
85 test_with(mvs1, mvs2, m1);
90 void operator()(int) const
97 ublas::banded_adaptor<M> bam1(m1, 1, 1);
98 test_with(v1, v2, bam1);
100 ublas::matrix_row<ublas::banded_adaptor<M> > mr1(bam1, 1), mr2(bam1, 1);
101 test_with(mr1, mr2, bam1);
103 ublas::matrix_column<ublas::banded_adaptor<M> > mc1(bam1, 1), mc2(bam1, 1);
104 test_with(mc1, mc2, bam1);
107 ublas::matrix_vector_range<ublas::banded_adaptor<M> > mvr1(bam1, ublas::range(0, N), ublas::range(0, N)),
108 mvr2(bam1, ublas::range(0, N), ublas::range(0, N));
109 test_with(mvr1, mvr2, bam1);
113 ublas::matrix_vector_slice<ublas::banded_adaptor<M> > mvs1(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
114 mvs2(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
115 test_with(mvs1, mvs2, bam1);
121 ublas::diagonal_adaptor<M> dam1(m1);
122 test_with(v1, v2, dam1);
124 ublas::matrix_row<ublas::diagonal_adaptor<M> > mr1(dam1, 1), mr2(dam1, 1);
125 test_with(mr1, mr2, dam1);
127 ublas::matrix_column<ublas::diagonal_adaptor<M> > mc1(dam1, 1), mc2(dam1, 1);
128 test_with(mc1, mc2, dam1);
131 ublas::matrix_vector_range<ublas::diagonal_adaptor<M> > mvr1(dam1, ublas::range(0, N), ublas::range(0, N)),
132 mvr2(dam1, ublas::range(0, N), ublas::range(0, N));
133 test_with(mvr1, mvr2, dam1);
137 ublas::matrix_vector_slice<ublas::diagonal_adaptor<M> > mvs1(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
138 mvs2(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
139 test_with(mvs1, mvs2, dam1);
147 // Test matrix & vector
148 void test_matrix_vector()
150 std::cout << "test_matrix_vector" << std::endl;
153 #ifdef USE_BOUNDED_ARRAY
155 std::cout << "mp_test_type, bounded_array" << std::endl;
156 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
157 ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();
158 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
159 ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);
163 std::cout << "double, bounded_array" << std::endl;
164 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
165 ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();
166 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
167 ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);
170 #ifdef USE_STD_COMPLEX
172 std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl;
173 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
174 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();
175 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
176 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);
180 std::cout << "std::complex<double>, bounded_array" << std::endl;
181 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
182 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();
183 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
184 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);
189 #ifdef USE_UNBOUNDED_ARRAY
191 std::cout << "mp_test_type, unbounded_array" << std::endl;
192 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
193 ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();
194 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
195 ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);
199 std::cout << "double, unbounded_array" << std::endl;
200 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
201 ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();
202 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
203 ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);
206 #ifdef USE_STD_COMPLEX
208 std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl;
209 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
210 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();
211 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
212 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);
216 std::cout << "std::complex<double>, unbounded_array" << std::endl;
217 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
218 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();
219 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
220 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);
225 #ifdef USE_STD_VECTOR
227 std::cout << "mp_test_type, std::vector" << std::endl;
228 test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
229 ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();
230 test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
231 ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);
235 std::cout << "double, std::vector" << std::endl;
236 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
237 ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()();
238 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
239 ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0);
242 #ifdef USE_STD_COMPLEX
244 std::cout << "std::complex<mp_test_type>, std::vector" << std::endl;
245 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
246 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();
247 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
248 ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);
252 std::cout << "std::complex<double>, std::vector" << std::endl;
253 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
254 ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();
255 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
256 ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);
263 #ifdef USE_BOUNDED_ARRAY
265 std::cout << "mp_test_type, bounded_array" << std::endl;
266 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
267 ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();
268 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
269 ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);
273 std::cout << "double, bounded_array" << std::endl;
274 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
275 ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();
276 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
277 ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);
280 #ifdef USE_STD_COMPLEX
282 std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl;
283 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
284 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();
285 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
286 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);
290 std::cout << "std::complex<double>, bounded_array" << std::endl;
291 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
292 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();
293 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
294 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);
299 #ifdef USE_UNBOUNDED_ARRAY
301 std::cout << "mp_test_type, unbounded_array" << std::endl;
302 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
303 ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();
304 test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
305 ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);
309 std::cout << "double, unbounded_array" << std::endl;
310 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
311 ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();
312 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
313 ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);
316 #ifdef USE_STD_COMPLEX
318 std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl;
319 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
320 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();
321 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
322 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);
326 std::cout << "std::complex<double>, unbounded_array" << std::endl;
327 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
328 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();
329 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
330 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);
335 #ifdef USE_STD_VECTOR
337 std::cout << "mp_test_type, std::vector" << std::endl;
338 test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
339 ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();
340 test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
341 ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);
345 std::cout << "double, std::vector" << std::endl;
346 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
347 ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()();
348 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
349 ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0);
352 #ifdef USE_STD_COMPLEX
354 std::cout << "std::complex<mp_test_type>, std::vector" << std::endl;
355 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
356 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();
357 test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
358 ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);
362 std::cout << "std::complex<double>, std::vector" << std::endl;
363 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
364 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();
365 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
366 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);