test62.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. #if defined(__GNUC__) && (__GNUC__ >= 9)
  13. #pragma GCC diagnostic ignored "-Wdeprecated-copy"
  14. #endif
  15. #include "test6.hpp"
  16. // Test matrix & vector expression templates
  17. template <class V, class M, int N>
  18. struct test_my_matrix_vector
  19. {
  20. typedef typename V::value_type value_type;
  21. template <class VP, class MP>
  22. void test_with(VP& v1, VP& v2, MP& m1) const
  23. {
  24. {
  25. // Rows and columns
  26. initialize_matrix(m1);
  27. for (int i = 0; i < N; ++i)
  28. {
  29. v2 = ublas::row(m1, i);
  30. std::cout << "row (m, " << i << ") = " << v2 << std::endl;
  31. v2 = ublas::column(m1, i);
  32. std::cout << "column (m, " << i << ") = " << v2 << std::endl;
  33. }
  34. // Outer product
  35. initialize_vector(v1);
  36. initialize_vector(v2);
  37. v1(0) = 0;
  38. v1(N - 1) = 0;
  39. v2(0) = 0;
  40. v2(N - 1) = 0;
  41. m1 = ublas::outer_prod(v1, v2);
  42. std::cout << "outer_prod (v1, v2) = " << m1 << std::endl;
  43. // Matrix vector product
  44. initialize_matrix(m1);
  45. initialize_vector(v1);
  46. v2 = ublas::prod(m1, v1);
  47. std::cout << "prod (m1, v1) = " << v2 << std::endl;
  48. v2 = ublas::prod(v1, m1);
  49. std::cout << "prod (v1, m1) = " << v2 << std::endl;
  50. }
  51. }
  52. void operator()() const
  53. {
  54. {
  55. V v1(N), v2(N);
  56. M m1(N, N);
  57. test_with(v1, v2, m1);
  58. ublas::matrix_row<M> mr1(m1, N - 1), mr2(m1, N - 1);
  59. test_with(mr1, mr2, m1);
  60. ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 0);
  61. test_with(mc1, mc2, m1);
  62. #ifdef USE_RANGE
  63. ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),
  64. mvr2(m1, ublas::range(0, N), ublas::range(0, N));
  65. test_with(mvr1, mvr2, m1);
  66. #endif
  67. #ifdef USE_SLICE
  68. ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
  69. mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
  70. test_with(mvs1, mvs2, m1);
  71. #endif
  72. }
  73. }
  74. void operator()(int) const
  75. {
  76. #ifdef USE_ADAPTOR
  77. {
  78. V v1(N), v2(N);
  79. M m1(N, N);
  80. ublas::symmetric_adaptor<M> tam1(m1);
  81. test_with(v1, v2, tam1);
  82. ublas::matrix_row<ublas::symmetric_adaptor<M> > mr1(tam1, N - 1), mr2(tam1, N - 1);
  83. test_with(mr1, mr2, tam1);
  84. ublas::matrix_column<ublas::symmetric_adaptor<M> > mc1(tam1, 0), mc2(tam1, 0);
  85. test_with(mc1, mc2, tam1);
  86. #ifdef USE_RANGE
  87. ublas::matrix_vector_range<ublas::symmetric_adaptor<M> > mvr1(tam1, ublas::range(0, N), ublas::range(0, N)),
  88. mvr2(tam1, ublas::range(0, N), ublas::range(0, N));
  89. test_with(mvr1, mvr2, tam1);
  90. #endif
  91. #ifdef USE_SLICE
  92. ublas::matrix_vector_slice<ublas::symmetric_adaptor<M> > mvs1(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
  93. mvs2(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
  94. test_with(mvs1, mvs2, tam1);
  95. #endif
  96. }
  97. #endif
  98. }
  99. };
  100. // Test matrix & vector
  101. void test_matrix_vector()
  102. {
  103. std::cout << "test_matrix_vector" << std::endl;
  104. #ifdef USE_BOUNDED_ARRAY
  105. #ifdef USE_FLOAT
  106. std::cout << "mp_test_type, bounded_array" << std::endl;
  107. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
  108. ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();
  109. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
  110. ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);
  111. #endif
  112. #ifdef USE_DOUBLE
  113. std::cout << "double, bounded_array" << std::endl;
  114. test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
  115. ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();
  116. test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
  117. ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);
  118. #endif
  119. #ifdef USE_STD_COMPLEX
  120. #ifdef USE_FLOAT
  121. std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl;
  122. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
  123. ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();
  124. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
  125. ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);
  126. #endif
  127. #ifdef USE_DOUBLE
  128. std::cout << "std::complex<double>, bounded_array" << std::endl;
  129. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
  130. ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();
  131. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
  132. ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);
  133. #endif
  134. #endif
  135. #endif
  136. #ifdef USE_UNBOUNDED_ARRAY
  137. #ifdef USE_FLOAT
  138. std::cout << "mp_test_type, unbounded_array" << std::endl;
  139. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
  140. ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();
  141. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
  142. ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);
  143. #endif
  144. #ifdef USE_DOUBLE
  145. std::cout << "double, unbounded_array" << std::endl;
  146. test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
  147. ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()();
  148. test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
  149. ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);
  150. #endif
  151. #ifdef USE_STD_COMPLEX
  152. #ifdef USE_FLOAT
  153. std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl;
  154. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
  155. ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();
  156. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
  157. ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);
  158. #endif
  159. #ifdef USE_DOUBLE
  160. std::cout << "std::complex<double>, unbounded_array" << std::endl;
  161. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
  162. ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();
  163. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
  164. ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);
  165. #endif
  166. #endif
  167. #endif
  168. #ifdef USE_STD_VECTOR
  169. #ifdef USE_FLOAT
  170. std::cout << "mp_test_type, std::vector" << std::endl;
  171. test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
  172. ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()();
  173. test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
  174. ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);
  175. #endif
  176. #ifdef USE_DOUBLE
  177. std::cout << "double, std::vector" << std::endl;
  178. test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
  179. ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()();
  180. test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
  181. ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(0);
  182. #endif
  183. #ifdef USE_STD_COMPLEX
  184. #ifdef USE_FLOAT
  185. std::cout << "std::complex<mp_test_type>, std::vector" << std::endl;
  186. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
  187. ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();
  188. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
  189. ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);
  190. #endif
  191. #ifdef USE_DOUBLE
  192. std::cout << "std::complex<double>, std::vector" << std::endl;
  193. test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
  194. ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()();
  195. test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
  196. ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);
  197. #endif
  198. #endif
  199. #endif
  200. }