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