]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/numeric/ublas/test/test43.cpp
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.
15 // Test matrix expression templates
16 template<class M
, int N
>
17 struct test_my_matrix
{
18 typedef typename
M::value_type value_type
;
21 void test_with (MP
&m1
, MP
&m2
, MP
&m3
) const {
26 default_construct
<MP
>::test ();
29 initialize_matrix (m1
);
30 initialize_matrix (m2
);
32 std::cout
<< "m1 = m2 = " << m1
<< std::endl
;
33 m1
.assign_temporary (m2
);
34 std::cout
<< "m1.assign_temporary (m2) = " << m1
<< std::endl
;
36 std::cout
<< "m1.swap (m2) = " << m1
<< " " << m2
<< std::endl
;
39 m1
= ublas::zero_matrix
<> (m1
.size1 (), m1
.size2 ());
40 std::cout
<< "m1.zero_matrix = " << m1
<< std::endl
;
43 // Unary matrix operations resulting in a matrix
44 initialize_matrix (m1
);
46 std::cout
<< "- m1 = " << m2
<< std::endl
;
47 m2
= ublas::conj (m1
);
48 std::cout
<< "conj (m1) = " << m2
<< std::endl
;
50 // Binary matrix operations resulting in a matrix
51 initialize_matrix (m1
);
52 initialize_matrix (m2
);
54 std::cout
<< "m1 + m2 = " << m3
<< std::endl
;
56 std::cout
<< "m1 - m2 = " << m3
<< std::endl
;
60 initialize_matrix (m1
);
61 m2
= value_type (1.) * m1
;
62 std::cout
<< "1. * m1 = " << m2
<< std::endl
;
64 std::cout
<< "N * m1 = " << m2
<< std::endl
;
65 initialize_matrix (m1
);
66 m2
= m1
* value_type (1.);
67 std::cout
<< "m1 * 1. = " << m2
<< std::endl
;
69 std::cout
<< "m1 * N = " << m2
<< std::endl
;
72 initialize_matrix (m1
);
73 initialize_matrix (m2
);
75 std::cout
<< "m2 += m1 = " << m2
<< std::endl
;
77 std::cout
<< "m2 -= m1 = " << m2
<< std::endl
;
79 std::cout
<< "m2 = m2 + m1 = " << m2
<< std::endl
;
81 std::cout
<< "m2 = m2 - m1 = " << m2
<< std::endl
;
82 m1
*= value_type (1.);
83 std::cout
<< "m1 *= 1. = " << m1
<< std::endl
;
85 std::cout
<< "m1 *= N = " << m1
<< std::endl
;
88 initialize_matrix (m1
);
89 m2
= ublas::trans (m1
);
90 std::cout
<< "trans (m1) = " << m2
<< std::endl
;
93 initialize_matrix (m1
);
94 m2
= ublas::herm (m1
);
95 std::cout
<< "herm (m1) = " << m2
<< std::endl
;
97 // Matrix multiplication
98 initialize_matrix (m1
);
99 initialize_matrix (m2
);
100 // Banded times banded isn't banded
101 std::cout
<< "prod (m1, m2) = " << ublas::prod (m1
, m2
) << std::endl
;
104 void operator () () const {
107 M
m1 (N
, N
, 1, 1), m2 (N
, N
, 1, 1), m3 (N
, N
, 1, 1);
110 M
m1 (N
, N
), m2 (N
, N
), m3 (N
, N
);
112 test_with (m1
, m2
, m3
);
115 ublas::matrix_range
<M
> mr1 (m1
, ublas::range (0, N
), ublas::range (0, N
)),
116 mr2 (m2
, ublas::range (0, N
), ublas::range (0, N
)),
117 mr3 (m3
, ublas::range (0, N
), ublas::range (0, N
));
118 test_with (mr1
, mr2
, mr3
);
122 ublas::matrix_slice
<M
> ms1 (m1
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
123 ms2 (m2
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
124 ms3 (m3
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
));
125 test_with (ms1
, ms2
, ms3
);
132 M
m1 (N
, N
, 1, 1), m2 (N
, N
, 1, 1), m3 (N
, N
, 1, 1);
133 ublas::banded_adaptor
<M
> bam1 (m1
, 1, 1), bam2 (m2
, 1, 1), bam3 (m3
, 1, 1);
134 test_with (bam1
, bam2
, bam3
);
137 ublas::matrix_range
<ublas::banded_adaptor
<M
> > mr1 (bam1
, ublas::range (0, N
), ublas::range (0, N
)),
138 mr2 (bam2
, ublas::range (0, N
), ublas::range (0, N
)),
139 mr3 (bam3
, ublas::range (0, N
), ublas::range (0, N
));
140 test_with (mr1
, mr2
, mr3
);
144 ublas::matrix_slice
<ublas::banded_adaptor
<M
> > ms1 (bam1
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
145 ms2 (bam2
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
146 ms3 (bam3
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
));
147 test_with (ms1
, ms2
, ms3
);
151 M
m1 (N
, N
), m2 (N
, N
), m3 (N
, N
);
152 ublas::diagonal_adaptor
<M
> dam1 (m1
), dam2 (m2
), dam3 (m3
);
153 test_with (dam1
, dam2
, dam3
);
156 ublas::matrix_range
<ublas::diagonal_adaptor
<M
> > mr1 (dam1
, ublas::range (0, N
), ublas::range (0, N
)),
157 mr2 (dam2
, ublas::range (0, N
), ublas::range (0, N
)),
158 mr3 (dam3
, ublas::range (0, N
), ublas::range (0, N
));
159 test_with (mr1
, mr2
, mr3
);
163 ublas::matrix_slice
<ublas::diagonal_adaptor
<M
> > ms1 (dam1
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
164 ms2 (dam2
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
)),
165 ms3 (dam3
, ublas::slice (0, 1, N
), ublas::slice (0, 1, N
));
166 test_with (ms1
, ms2
, ms3
);
176 void test_matrix () {
177 std::cout
<< "test_matrix" << std::endl
;
180 #ifdef USE_BOUNDED_ARRAY
182 std::cout
<< "float, bounded_array" << std::endl
;
183 test_my_matrix
<ublas::banded_matrix
<float, ublas::row_major
, ublas::bounded_array
<float, 3 * 3> >, 3 > () ();
187 std::cout
<< "double, bounded_array" << std::endl
;
188 test_my_matrix
<ublas::banded_matrix
<double, ublas::row_major
, ublas::bounded_array
<double, 3 * 3> >, 3 > () ();
191 #ifdef USE_STD_COMPLEX
193 std::cout
<< "std::complex<float>, bounded_array" << std::endl
;
194 test_my_matrix
<ublas::banded_matrix
<std::complex<float>, ublas::row_major
, ublas::bounded_array
<std::complex<float>, 3 * 3> >, 3 > () ();
198 std::cout
<< "std::complex<double>, bounded_array" << std::endl
;
199 test_my_matrix
<ublas::banded_matrix
<std::complex<double>, ublas::row_major
, ublas::bounded_array
<std::complex<double>, 3 * 3> >, 3 > () ();
204 #ifdef USE_UNBOUNDED_ARRAY
206 std::cout
<< "float, unbounded_array" << std::endl
;
207 test_my_matrix
<ublas::banded_matrix
<float, ublas::row_major
, ublas::unbounded_array
<float> >, 3 > () ();
211 std::cout
<< "double, unbounded_array" << std::endl
;
212 test_my_matrix
<ublas::banded_matrix
<double, ublas::row_major
, ublas::unbounded_array
<double> >, 3 > () ();
215 #ifdef USE_STD_COMPLEX
217 std::cout
<< "std::complex<float>, unbounded_array" << std::endl
;
218 test_my_matrix
<ublas::banded_matrix
<std::complex<float>, ublas::row_major
, ublas::unbounded_array
<std::complex<float> > >, 3 > () ();
222 std::cout
<< "std::complex<double>, unbounded_array" << std::endl
;
223 test_my_matrix
<ublas::banded_matrix
<std::complex<double>, ublas::row_major
, ublas::unbounded_array
<std::complex<double> > >, 3 > () ();
228 #ifdef USE_STD_VECTOR
230 std::cout
<< "float, std::vector" << std::endl
;
231 test_my_matrix
<ublas::banded_matrix
<float, ublas::row_major
, std::vector
<float> >, 3 > () ();
235 std::cout
<< "double, std::vector" << std::endl
;
236 test_my_matrix
<ublas::banded_matrix
<double, ublas::row_major
, std::vector
<double> >, 3 > () ();
239 #ifdef USE_STD_COMPLEX
241 std::cout
<< "std::complex<float>, std::vector" << std::endl
;
242 test_my_matrix
<ublas::banded_matrix
<std::complex<float>, ublas::row_major
, std::vector
<std::complex<float> > >, 3 > () ();
246 std::cout
<< "std::complex<double>, std::vector" << std::endl
;
247 test_my_matrix
<ublas::banded_matrix
<std::complex<double>, ublas::row_major
, std::vector
<std::complex<double> > >, 3 > () ();
254 #ifdef USE_BOUNDED_ARRAY
256 std::cout
<< "float, bounded_array" << std::endl
;
257 test_my_matrix
<ublas::diagonal_matrix
<float, ublas::row_major
, ublas::bounded_array
<float, 3 * 3> >, 3 > () ();
261 std::cout
<< "double, bounded_array" << std::endl
;
262 test_my_matrix
<ublas::diagonal_matrix
<double, ublas::row_major
, ublas::bounded_array
<double, 3 * 3> >, 3 > () ();
265 #ifdef USE_STD_COMPLEX
267 std::cout
<< "std::complex<float>, bounded_array" << std::endl
;
268 test_my_matrix
<ublas::diagonal_matrix
<std::complex<float>, ublas::row_major
, ublas::bounded_array
<std::complex<float>, 3 * 3> >, 3 > () ();
272 std::cout
<< "std::complex<double>, bounded_array" << std::endl
;
273 test_my_matrix
<ublas::diagonal_matrix
<std::complex<double>, ublas::row_major
, ublas::bounded_array
<std::complex<double>, 3 * 3> >, 3 > () ();
278 #ifdef USE_UNBOUNDED_ARRAY
280 std::cout
<< "float, unbounded_array" << std::endl
;
281 test_my_matrix
<ublas::diagonal_matrix
<float, ublas::row_major
, ublas::unbounded_array
<float> >, 3 > () ();
285 std::cout
<< "double, unbounded_array" << std::endl
;
286 test_my_matrix
<ublas::diagonal_matrix
<double, ublas::row_major
, ublas::unbounded_array
<double> >, 3 > () ();
289 #ifdef USE_STD_COMPLEX
291 std::cout
<< "std::complex<float>, unbounded_array" << std::endl
;
292 test_my_matrix
<ublas::diagonal_matrix
<std::complex<float>, ublas::row_major
, ublas::unbounded_array
<std::complex<float> > >, 3 > () ();
296 std::cout
<< "std::complex<double>, unbounded_array" << std::endl
;
297 test_my_matrix
<ublas::diagonal_matrix
<std::complex<double>, ublas::row_major
, ublas::unbounded_array
<std::complex<double> > >, 3 > () ();
302 #ifdef USE_STD_VECTOR
304 std::cout
<< "float, std::vector" << std::endl
;
305 test_my_matrix
<ublas::diagonal_matrix
<float, ublas::row_major
, std::vector
<float> >, 3 > () ();
309 std::cout
<< "double, std::vector" << std::endl
;
310 test_my_matrix
<ublas::diagonal_matrix
<double, ublas::row_major
, std::vector
<double> >, 3 > () ();
313 #ifdef USE_STD_COMPLEX
315 std::cout
<< "std::complex<float>, std::vector" << std::endl
;
316 test_my_matrix
<ublas::diagonal_matrix
<std::complex<float>, ublas::row_major
, std::vector
<std::complex<float> > >, 3 > () ();
320 std::cout
<< "std::complex<double>, std::vector" << std::endl
;
321 test_my_matrix
<ublas::diagonal_matrix
<std::complex<double>, ublas::row_major
, std::vector
<std::complex<double> > >, 3 > () ();