1//
2// Copyright (c) 2000-2002
3// Joerg Walter, Mathias Koch
4//
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)
8//
9// The authors gratefully acknowledge the support of
10// GeNeSys mbH & Co. KG in producing this work.
11//
12
13#include "test4.hpp"
14#include "utils.hpp"
15
16// Test matrix & vector expression templates
17template<class V, class M, int N>
18struct test_my_matrix_vector {
19 typedef typename V::value_type value_type;
20
21 template<class VP, class MP>
22 void test_with (VP &v1, VP &v2, MP &m1) const {
23 {
24#ifndef USE_DIAGONAL
25 // Rows and columns
26 initialize_matrix (m1);
27 for (int i = 0; i < N; ++ i) {
28 v2 = ublas::row (m1, i);
29 std::cout << "row (m, " << i << ") = " << v2 << std::endl;
30 v2 = ublas::column (m1, i);
31 std::cout << "column (m, " << i << ") = " << v2 << std::endl;
32 }
33
34 // Outer product
35 initialize_vector (v1);
36 initialize_vector (v2);
37 v1 (0) = 0;
38 v1 (N - 1) = 0;
39 m1 = ublas::outer_prod (v1, v2);
40 std::cout << "outer_prod (v1, v2) = " << m1 << std::endl;
41
42 // Matrix vector product
43 initialize_matrix (m1);
44 initialize_vector (v1);
45 v2 = ublas::prod (m1, v1);
46 std::cout << "prod (m1, v1) = " << v2 << std::endl;
47 v2 = ublas::prod (v1, m1);
48 std::cout << "prod (v1, m1) = " << v2 << std::endl;
49#else
50 BOOST_UBLAS_NOT_USED(v1);
51 BOOST_UBLAS_NOT_USED(v2);
52 BOOST_UBLAS_NOT_USED(m1);
53#endif
54 }
55 }
56 void operator () () const {
57 {
58 V v1 (N), v2 (N);
59#ifdef USE_BANDED
60 M m1 (N, N, 1, 1);
61#endif
62#ifdef USE_DIAGONAL
63 M m1 (N, N);
64#endif
65 test_with (v1, v2, m1);
66
67 ublas::matrix_row<M> mr1 (m1, 1), mr2 (m1, 1);
68 test_with (mr1, mr2, m1);
69
70 ublas::matrix_column<M> mc1 (m1, 1), mc2 (m1, 1);
71 test_with (mc1, mc2, m1);
72
73#ifdef USE_RANGE
74 ublas::matrix_vector_range<M> mvr1 (m1, ublas::range (0, N), ublas::range (0, N)),
75 mvr2 (m1, ublas::range (0, N), ublas::range (0, N));
76 test_with (mvr1, mvr2, m1);
77#endif
78
79#ifdef USE_SLICE
80 ublas::matrix_vector_slice<M> mvs1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)),
81 mvs2 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N));
82 test_with (mvs1, mvs2, m1);
83#endif
84 }
85 }
86
87 void operator () (int) const {
88#ifdef USE_ADAPTOR
89 {
90#ifdef USE_BANDED
91 V v1 (N), v2 (N);
92 M m1 (N, N, 1, 1);
93 ublas::banded_adaptor<M> bam1 (m1, 1, 1);
94 test_with (v1, v2, bam1);
95
96 ublas::matrix_row<ublas::banded_adaptor<M> > mr1 (bam1, 1), mr2 (bam1, 1);
97 test_with (mr1, mr2, bam1);
98
99 ublas::matrix_column<ublas::banded_adaptor<M> > mc1 (bam1, 1), mc2 (bam1, 1);
100 test_with (mc1, mc2, bam1);
101
102#ifdef USE_RANGE
103 ublas::matrix_vector_range<ublas::banded_adaptor<M> > mvr1 (bam1, ublas::range (0, N), ublas::range (0, N)),
104 mvr2 (bam1, ublas::range (0, N), ublas::range (0, N));
105 test_with (mvr1, mvr2, bam1);
106#endif
107
108#ifdef USE_SLICE
109 ublas::matrix_vector_slice<ublas::banded_adaptor<M> > mvs1 (bam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)),
110 mvs2 (bam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N));
111 test_with (mvs1, mvs2, bam1);
112#endif
113#endif
114#ifdef USE_DIAGONAL
115 V v1 (N), v2 (N);
116 M m1 (N, N);
117 ublas::diagonal_adaptor<M> dam1 (m1);
118 test_with (v1, v2, dam1);
119
120 ublas::matrix_row<ublas::diagonal_adaptor<M> > mr1 (dam1, 1), mr2 (dam1, 1);
121 test_with (mr1, mr2, dam1);
122
123 ublas::matrix_column<ublas::diagonal_adaptor<M> > mc1 (dam1, 1), mc2 (dam1, 1);
124 test_with (mc1, mc2, dam1);
125
126#ifdef USE_RANGE
127 ublas::matrix_vector_range<ublas::diagonal_adaptor<M> > mvr1 (dam1, ublas::range (0, N), ublas::range (0, N)),
128 mvr2 (dam1, ublas::range (0, N), ublas::range (0, N));
129 test_with (mvr1, mvr2, dam1);
130#endif
131
132#ifdef USE_SLICE
133 ublas::matrix_vector_slice<ublas::diagonal_adaptor<M> > mvs1 (dam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)),
134 mvs2 (dam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N));
135 test_with (mvs1, mvs2, dam1);
136#endif
137#endif
138 }
139#endif
140 }
141};
142
143// Test matrix & vector
144void test_matrix_vector () {
145 std::cout << "test_matrix_vector" << std::endl;
146
147#ifdef USE_BANDED
148#ifdef USE_BOUNDED_ARRAY
149#ifdef USE_FLOAT
150 std::cout << "float, bounded_array" << std::endl;
151 test_my_matrix_vector<ublas::vector<float, ublas::bounded_array<float, 3> >,
152 ublas::banded_matrix<float, ublas::row_major, ublas::bounded_array<float, 3 * 3> >, 3> () ();
153 test_my_matrix_vector<ublas::vector<float, ublas::bounded_array<float, 3> >,
154 ublas::banded_matrix<float, ublas::row_major, ublas::bounded_array<float, 3 * 3> >, 3> () (0);
155#endif
156
157#ifdef USE_DOUBLE
158 std::cout << "double, bounded_array" << std::endl;
159 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
160 ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3> () ();
161 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
162 ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3> () (0);
163#endif
164
165#ifdef USE_STD_COMPLEX
166#ifdef USE_FLOAT
167 std::cout << "std::complex<float>, bounded_array" << std::endl;
168 test_my_matrix_vector<ublas::vector<std::complex<float>, ublas::bounded_array<std::complex<float>, 3> >,
169 ublas::banded_matrix<std::complex<float>, ublas::row_major, ublas::bounded_array<std::complex<float>, 3 * 3> >, 3> () ();
170 test_my_matrix_vector<ublas::vector<std::complex<float>, ublas::bounded_array<std::complex<float>, 3> >,
171 ublas::banded_matrix<std::complex<float>, ublas::row_major, ublas::bounded_array<std::complex<float>, 3 * 3> >, 3> () (0);
172#endif
173
174#ifdef USE_DOUBLE
175 std::cout << "std::complex<double>, bounded_array" << std::endl;
176 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
177 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3> () ();
178 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
179 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3> () (0);
180#endif
181#endif
182#endif
183
184#ifdef USE_UNBOUNDED_ARRAY
185#ifdef USE_FLOAT
186 std::cout << "float, unbounded_array" << std::endl;
187 test_my_matrix_vector<ublas::vector<float, ublas::unbounded_array<float> >,
188 ublas::banded_matrix<float, ublas::row_major, ublas::unbounded_array<float> >, 3> () ();
189 test_my_matrix_vector<ublas::vector<float, ublas::unbounded_array<float> >,
190 ublas::banded_matrix<float, ublas::row_major, ublas::unbounded_array<float> >, 3> () (0);
191#endif
192
193#ifdef USE_DOUBLE
194 std::cout << "double, unbounded_array" << std::endl;
195 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
196 ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3> () ();
197 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
198 ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3> () (0);
199#endif
200
201#ifdef USE_STD_COMPLEX
202#ifdef USE_FLOAT
203 std::cout << "std::complex<float>, unbounded_array" << std::endl;
204 test_my_matrix_vector<ublas::vector<std::complex<float>, ublas::unbounded_array<std::complex<float> > >,
205 ublas::banded_matrix<std::complex<float>, ublas::row_major, ublas::unbounded_array<std::complex<float> > >, 3> () ();
206 test_my_matrix_vector<ublas::vector<std::complex<float>, ublas::unbounded_array<std::complex<float> > >,
207 ublas::banded_matrix<std::complex<float>, ublas::row_major, ublas::unbounded_array<std::complex<float> > >, 3> () (0);
208#endif
209
210#ifdef USE_DOUBLE
211 std::cout << "std::complex<double>, unbounded_array" << std::endl;
212 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
213 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3> () ();
214 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
215 ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3> () (0);
216#endif
217#endif
218#endif
219
220#ifdef USE_STD_VECTOR
221#ifdef USE_FLOAT
222 std::cout << "float, std::vector" << std::endl;
223 test_my_matrix_vector<ublas::vector<float, std::vector<float> >,
224 ublas::banded_matrix<float, ublas::row_major, std::vector<float> >, 3> () ();
225 test_my_matrix_vector<ublas::vector<float, std::vector<float> >,
226 ublas::banded_matrix<float, ublas::row_major, std::vector<float> >, 3> () (0);
227#endif
228
229#ifdef USE_DOUBLE
230 std::cout << "double, std::vector" << std::endl;
231 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
232 ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3> () ();
233 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
234 ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3> () (0);
235#endif
236
237#ifdef USE_STD_COMPLEX
238#ifdef USE_FLOAT
239 std::cout << "std::complex<float>, std::vector" << std::endl;
240 test_my_matrix_vector<ublas::vector<std::complex<float>, std::vector<std::complex<float> > >,
241 ublas::banded_matrix<std::complex<float>, ublas::row_major, std::vector<std::complex<float> > >, 3> () ();
242 test_my_matrix_vector<ublas::vector<std::complex<float>, std::vector<std::complex<float> > >,
243 ublas::banded_matrix<std::complex<float>, ublas::row_major, std::vector<std::complex<float> > >, 3> () (0);
244#endif
245
246#ifdef USE_DOUBLE
247 std::cout << "std::complex<double>, std::vector" << std::endl;
248 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
249 ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3> () ();
250 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
251 ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3> () (0);
252#endif
253#endif
254#endif
255#endif
256
257#ifdef USE_DIAGONAL
258#ifdef USE_BOUNDED_ARRAY
259#ifdef USE_FLOAT
260 std::cout << "float, bounded_array" << std::endl;
261 test_my_matrix_vector<ublas::vector<float, ublas::bounded_array<float, 3> >,
262 ublas::diagonal_matrix<float, ublas::row_major, ublas::bounded_array<float, 3 * 3> >, 3> () ();
263 test_my_matrix_vector<ublas::vector<float, ublas::bounded_array<float, 3> >,
264 ublas::diagonal_matrix<float, ublas::row_major, ublas::bounded_array<float, 3 * 3> >, 3> () (0);
265#endif
266
267#ifdef USE_DOUBLE
268 std::cout << "double, bounded_array" << std::endl;
269 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
270 ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3> () ();
271 test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
272 ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3> () (0);
273#endif
274
275#ifdef USE_STD_COMPLEX
276#ifdef USE_FLOAT
277 std::cout << "std::complex<float>, bounded_array" << std::endl;
278 test_my_matrix_vector<ublas::vector<std::complex<float>, ublas::bounded_array<std::complex<float>, 3> >,
279 ublas::diagonal_matrix<std::complex<float>, ublas::row_major, ublas::bounded_array<std::complex<float>, 3 * 3> >, 3> () ();
280 test_my_matrix_vector<ublas::vector<std::complex<float>, ublas::bounded_array<std::complex<float>, 3> >,
281 ublas::diagonal_matrix<std::complex<float>, ublas::row_major, ublas::bounded_array<std::complex<float>, 3 * 3> >, 3> () (0);
282#endif
283
284#ifdef USE_DOUBLE
285 std::cout << "std::complex<double>, bounded_array" << std::endl;
286 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
287 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3> () ();
288 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
289 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3> () (0);
290#endif
291#endif
292#endif
293
294#ifdef USE_UNBOUNDED_ARRAY
295#ifdef USE_FLOAT
296 std::cout << "float, unbounded_array" << std::endl;
297 test_my_matrix_vector<ublas::vector<float, ublas::unbounded_array<float> >,
298 ublas::diagonal_matrix<float, ublas::row_major, ublas::unbounded_array<float> >, 3> () ();
299 test_my_matrix_vector<ublas::vector<float, ublas::unbounded_array<float> >,
300 ublas::diagonal_matrix<float, ublas::row_major, ublas::unbounded_array<float> >, 3> () (0);
301#endif
302
303#ifdef USE_DOUBLE
304 std::cout << "double, unbounded_array" << std::endl;
305 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
306 ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3> () ();
307 test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
308 ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3> () (0);
309#endif
310
311#ifdef USE_STD_COMPLEX
312#ifdef USE_FLOAT
313 std::cout << "std::complex<float>, unbounded_array" << std::endl;
314 test_my_matrix_vector<ublas::vector<std::complex<float>, ublas::unbounded_array<std::complex<float> > >,
315 ublas::diagonal_matrix<std::complex<float>, ublas::row_major, ublas::unbounded_array<std::complex<float> > >, 3> () ();
316 test_my_matrix_vector<ublas::vector<std::complex<float>, ublas::unbounded_array<std::complex<float> > >,
317 ublas::diagonal_matrix<std::complex<float>, ublas::row_major, ublas::unbounded_array<std::complex<float> > >, 3> () (0);
318#endif
319
320#ifdef USE_DOUBLE
321 std::cout << "std::complex<double>, unbounded_array" << std::endl;
322 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
323 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3> () ();
324 test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
325 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3> () (0);
326#endif
327#endif
328#endif
329
330#ifdef USE_STD_VECTOR
331#ifdef USE_FLOAT
332 std::cout << "float, std::vector" << std::endl;
333 test_my_matrix_vector<ublas::vector<float, std::vector<float> >,
334 ublas::diagonal_matrix<float, ublas::row_major, std::vector<float> >, 3> () ();
335 test_my_matrix_vector<ublas::vector<float, std::vector<float> >,
336 ublas::diagonal_matrix<float, ublas::row_major, std::vector<float> >, 3> () (0);
337#endif
338
339#ifdef USE_DOUBLE
340 std::cout << "double, std::vector" << std::endl;
341 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
342 ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3> () ();
343 test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
344 ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3> () (0);
345#endif
346
347#ifdef USE_STD_COMPLEX
348#ifdef USE_FLOAT
349 std::cout << "std::complex<float>, std::vector" << std::endl;
350 test_my_matrix_vector<ublas::vector<std::complex<float>, std::vector<std::complex<float> > >,
351 ublas::diagonal_matrix<std::complex<float>, ublas::row_major, std::vector<std::complex<float> > >, 3> () ();
352 test_my_matrix_vector<ublas::vector<std::complex<float>, std::vector<std::complex<float> > >,
353 ublas::diagonal_matrix<std::complex<float>, ublas::row_major, std::vector<std::complex<float> > >, 3> () (0);
354#endif
355
356#ifdef USE_DOUBLE
357 std::cout << "std::complex<double>, std::vector" << std::endl;
358 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
359 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3> () ();
360 test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
361 ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3> () (0);
362#endif
363#endif
364#endif
365#endif
366}
367

source code of boost/libs/numeric/ublas/test/test42.cpp