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
17 template<class V, class M, int N>
18 struct test_my_matrix_vector {
19     typedef typename V::value_type value_type;
20 
21     template<class VP, class MP>
test_withtest_my_matrix_vector22     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     }
operator ()test_my_matrix_vector56     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 
operator ()test_my_matrix_vector87     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
test_matrix_vector()144 void 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