test_matrix_vector.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. //
  2. // Copyright (c) 2013 Joaquim Duran
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. #include <boost/numeric/ublas/assignment.hpp>
  9. #include <boost/numeric/ublas/matrix_sparse.hpp>
  10. #include <boost/numeric/ublas/matrix.hpp>
  11. #include <boost/numeric/ublas/matrix_vector.hpp>
  12. #include "common/testhelper.hpp"
  13. #include "utils.hpp"
  14. using namespace boost::numeric::ublas;
  15. template <class Vector, class StorageCategory>
  16. void guardSparsePreserveResize( Vector &vec, typename Vector::size_type new_size, StorageCategory) // Because sparse matrices don't have preserve data implemented
  17. {
  18. vec.resize( new_size );
  19. }
  20. template <class Vector>
  21. void guardSparsePreserveResize( Vector &vec, typename Vector::size_type new_size, sparse_tag) // Because sparse matrices don't have preserve data implemented
  22. {
  23. vec.resize( new_size, false );
  24. }
  25. template <class Matrix>
  26. bool test_matrix_row_facade() {
  27. bool pass = true;
  28. typedef matrix_row_vector<Matrix> RowVector;
  29. { // Testing resize
  30. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: resize" );
  31. typename Matrix::size_type num_rows = 3;
  32. typename Matrix::size_type num_cols = 5;
  33. Matrix matrix(num_rows, num_cols);
  34. RowVector rows(matrix);
  35. pass &= (matrix.size1() == num_rows);
  36. pass &= (rows.size() == num_rows);
  37. pass &= (matrix.size2() == num_cols);
  38. typename Matrix::size_type new_num_rows = 6;
  39. guardSparsePreserveResize( rows, new_num_rows, typename Matrix::storage_category());
  40. //rows.resize(new_num_rows);
  41. pass &= (matrix.size1() == new_num_rows);
  42. pass &= (rows.size() == new_num_rows);
  43. pass &= (matrix.size2() == num_cols);
  44. }
  45. { // Testing operator()
  46. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator()" );
  47. Matrix A(3,3), RA(3,3);
  48. RowVector rows(A);
  49. RA <<= 1, 2, 3,
  50. 4, 5, 6,
  51. 7, 8, 9;
  52. for(typename Matrix::size_type i = 0; i < A.size1(); i++) {
  53. rows(i) = matrix_row<Matrix>(RA, i);
  54. }
  55. pass &= compare_distance(A, RA);
  56. }
  57. { // Testing operator[]
  58. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator[]" );
  59. Matrix A(3,3), RA(3,3);
  60. RowVector rows(A);
  61. RA <<= 1, 2, 3,
  62. 4, 5, 6,
  63. 7, 8, 9;
  64. for(typename Matrix::size_type i = 0; i < A.size1(); i++) {
  65. rows[i] = matrix_row<Matrix>(RA, i);
  66. }
  67. pass &= compare_distance(A, RA);
  68. }
  69. { // Testing operator[] const
  70. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator[] const" );
  71. Matrix RA(3,3);
  72. RowVector rows(RA);
  73. RA <<= 1, 2, 3,
  74. 4, 5, 6,
  75. 7, 8, 9;
  76. for(typename Matrix::size_type i = 0; i < RA.size1(); i++) {
  77. pass &= compare_distance(rows[i], matrix_row<Matrix>(RA, i));
  78. }
  79. }
  80. { // Testing const iterator
  81. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: const iterator" );
  82. Matrix RA(3,3);
  83. RowVector rows(RA);
  84. RA <<= 1, 2, 3,
  85. 4, 5, 6,
  86. 7, 8, 9;
  87. typename RowVector::size_type i = 0;
  88. for(typename RowVector::const_iterator iter = rows.begin();
  89. iter != rows.end();
  90. iter++) {
  91. pass &= compare_distance(*iter, matrix_row<Matrix>(RA, i++));
  92. }
  93. }
  94. { // Testing iterator
  95. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: iterator" );
  96. Matrix A(3,3), RA(3,3);
  97. RowVector rows(A);
  98. RA <<= 1, 2, 3,
  99. 4, 5, 6,
  100. 7, 8, 9;
  101. typename RowVector::size_type i = 0;
  102. for(typename RowVector::iterator iter = rows.begin();
  103. iter != rows.end();
  104. iter++) {
  105. *iter = matrix_row<Matrix>(RA, i++);
  106. }
  107. pass &= compare_distance(A, RA);
  108. }
  109. { // Testing reserse iterator
  110. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: reverse iterator" );
  111. Matrix A(3,3), RA(3,3);
  112. RowVector rows(A);
  113. RA <<= 1, 2, 3,
  114. 4, 5, 6,
  115. 7, 8, 9;
  116. typename RowVector::size_type i = rows.size();
  117. for(typename RowVector::reverse_iterator iter = rows.rbegin();
  118. iter != rows.rend();
  119. iter++) {
  120. *iter = matrix_row<Matrix>(RA, --i);
  121. }
  122. pass &= compare_distance(A, RA);
  123. }
  124. { // Testing const reverse iterator
  125. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: const reverse iterator" );
  126. Matrix RA(3,3);
  127. RowVector rows(RA);
  128. RA <<= 1, 2, 3,
  129. 4, 5, 6,
  130. 7, 8, 9;
  131. typename RowVector::size_type i = rows.size();
  132. for(typename RowVector::const_reverse_iterator iter = rows.rbegin();
  133. iter != rows.rend();
  134. iter++) {
  135. pass &= compare_distance(*iter, matrix_row<Matrix>(RA, --i));
  136. }
  137. }
  138. return pass;
  139. }
  140. template <class Matrix>
  141. bool test_matrix_column_facade() {
  142. bool pass = true;
  143. typedef matrix_column_vector<Matrix> ColumnVector;
  144. { // Testing resize
  145. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: resize" );
  146. typename Matrix::size_type num_rows = 5;
  147. typename Matrix::size_type num_cols = 3;
  148. Matrix matrix(num_rows, num_cols);
  149. ColumnVector columns(matrix);
  150. pass &= (matrix.size2() == num_cols);
  151. pass &= (columns.size() == num_cols);
  152. pass &= (matrix.size1() == num_rows);
  153. typename Matrix::size_type new_num_cols = 6;
  154. guardSparsePreserveResize( columns, new_num_cols, typename Matrix::storage_category());
  155. //columns.resize(new_num_cols);
  156. pass &= (matrix.size2() == new_num_cols);
  157. pass &= (columns.size() == new_num_cols);
  158. pass &= (matrix.size1() == num_rows);
  159. }
  160. { // Testing operator ()
  161. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator()" );
  162. Matrix A(3,3), RA(3,3);
  163. ColumnVector columns(A);
  164. RA <<= 1, 2, 3,
  165. 4, 5, 6,
  166. 7, 8, 9;
  167. for(typename Matrix::size_type i = 0; i < A.size2(); i++) {
  168. columns(i) = matrix_column<Matrix>(RA, i);
  169. }
  170. pass &= compare_distance(A, RA);
  171. }
  172. { // Testing operator[]
  173. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator[]" );
  174. Matrix A(3,3), RA(3,3);
  175. ColumnVector columns(A);
  176. RA <<= 1, 2, 3,
  177. 4, 5, 6,
  178. 7, 8, 9;
  179. for(typename Matrix::size_type i = 0; i < A.size2(); i++) {
  180. columns[i] = matrix_column<Matrix>(RA, i);
  181. }
  182. pass &= compare_distance(A, RA);
  183. }
  184. { // Testing operator[] const
  185. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator[] const" );
  186. Matrix RA(3,3);
  187. ColumnVector columns(RA);
  188. RA <<= 1, 2, 3,
  189. 4, 5, 6,
  190. 7, 8, 9;
  191. for(typename Matrix::size_type i = 0; i < RA.size2(); i++) {
  192. pass &= compare_distance(columns[i], matrix_column<Matrix>(RA, i));
  193. }
  194. }
  195. { // Testing iterator
  196. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: iterator" );
  197. Matrix A(3,3), RA(3,3);
  198. ColumnVector columns(A);
  199. RA <<= 1, 2, 3,
  200. 4, 5, 6,
  201. 7, 8, 9;
  202. typename ColumnVector::size_type i = 0;
  203. for(typename ColumnVector::iterator iter = columns.begin();
  204. iter != columns.end();
  205. iter++) {
  206. *iter = matrix_column<Matrix>(RA, i++);
  207. }
  208. pass &= compare_distance(A, RA);
  209. }
  210. { // Testing const iterator
  211. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: const iterator" );
  212. Matrix RA(3,3);
  213. ColumnVector columns(RA);
  214. RA <<= 1, 2, 3,
  215. 4, 5, 6,
  216. 7, 8, 9;
  217. typename ColumnVector::size_type i = 0;
  218. for(typename ColumnVector::const_iterator iter = columns.begin();
  219. iter != columns.end();
  220. iter++) {
  221. pass &= compare_distance(*iter, matrix_column<Matrix>(RA, i++));
  222. }
  223. }
  224. { // Testing reserse iterator
  225. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: reverese iterator" );
  226. Matrix A(3,3), RA(3,3);
  227. ColumnVector columns(A);
  228. RA <<= 1, 2, 3,
  229. 4, 5, 6,
  230. 7, 8, 9;
  231. typename ColumnVector::size_type i = columns.size();
  232. for(typename ColumnVector::reverse_iterator iter = columns.rbegin();
  233. iter != columns.rend();
  234. iter++) {
  235. *iter = matrix_column<Matrix>(RA, --i);
  236. }
  237. pass &= compare_distance(A, RA);
  238. }
  239. { // Testing const reverse iterator
  240. BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: const reverese iterator" );
  241. Matrix RA(3,3);
  242. ColumnVector columns(RA);
  243. RA <<= 1, 2, 3,
  244. 4, 5, 6,
  245. 7, 8, 9;
  246. typename ColumnVector::size_type i = columns.size();
  247. for(typename ColumnVector::const_reverse_iterator iter = columns.rbegin();
  248. iter != columns.rend();
  249. iter++) {
  250. pass &= compare_distance(*iter, matrix_column<Matrix>(RA, --i));
  251. }
  252. }
  253. return pass;
  254. }
  255. BOOST_UBLAS_TEST_DEF (test_matrix_row_facade) {
  256. BOOST_UBLAS_DEBUG_TRACE( "Starting matrix row vector facade" );
  257. BOOST_UBLAS_DEBUG_TRACE( "Testing matrix..." );
  258. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<double> >());
  259. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<float> >());
  260. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<long> >());
  261. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<unsigned long> >());
  262. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<int> >());
  263. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<unsigned int> >());
  264. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<std::size_t> >());
  265. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<matrix<char> >());
  266. BOOST_UBLAS_DEBUG_TRACE( "Testing bounded_matrix..." );
  267. BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<double,7, 7> >()));
  268. BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<float,7, 7> >()));
  269. BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<long,7, 7> >()));
  270. BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<unsigned long,7, 7> >()));
  271. BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<int,7,7 > >()));
  272. BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<unsigned int,7, 7> >()));
  273. BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<char,7, 7> >()));
  274. BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade<bounded_matrix<std::size_t,7, 7> >()));
  275. BOOST_UBLAS_DEBUG_TRACE( "Testing mapped_matrix..." );
  276. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<double> >());
  277. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<float> >());
  278. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<long> >());
  279. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<unsigned long> >());
  280. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<int> >());
  281. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<unsigned int> >())
  282. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<std::size_t> >())
  283. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<mapped_matrix<char> >());
  284. BOOST_UBLAS_DEBUG_TRACE( "Testing compressed_matrix..." );
  285. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<double> >());
  286. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<float> >());
  287. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<long> >());
  288. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<unsigned long> >());
  289. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<int> >());
  290. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<unsigned int> >());
  291. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<std::size_t> >());
  292. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<compressed_matrix<char> >());
  293. BOOST_UBLAS_DEBUG_TRACE( "Testing coordinate_matrix..." );
  294. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<double> >());
  295. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<float> >());
  296. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<long> >())
  297. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<unsigned long> >())
  298. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<int> >());
  299. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<unsigned int> >());
  300. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<std::size_t> >());
  301. BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade<coordinate_matrix<char> >());
  302. }
  303. BOOST_UBLAS_TEST_DEF (test_matrix_column_facade) {
  304. BOOST_UBLAS_DEBUG_TRACE( "Starting matrix row column facade" );
  305. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<double> >());
  306. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<float> >());
  307. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<long> >());
  308. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<unsigned long> >());
  309. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<int> >());
  310. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<unsigned int> >());
  311. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<std::size_t> >());
  312. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<matrix<char> >());
  313. BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<double,7, 7> >()));
  314. BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<float,7, 7> >()));
  315. BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<long,7, 7> >()));
  316. BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<unsigned long,7, 7> >()));
  317. BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<int,7,7 > >()));
  318. BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<unsigned int,7, 7> >()));
  319. BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<char,7, 7> >()));
  320. BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade<bounded_matrix<std::size_t,7, 7> >()));
  321. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<double> >());
  322. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<float> >());
  323. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<long> >());
  324. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<unsigned long> >());
  325. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<int> >());
  326. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<unsigned int> >())
  327. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<std::size_t> >())
  328. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<mapped_matrix<char> >());
  329. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<double> >());
  330. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<float> >());
  331. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<long> >());
  332. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<unsigned long> >());
  333. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<int> >());
  334. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<unsigned int> >());
  335. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<std::size_t> >());
  336. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<compressed_matrix<char> >());
  337. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<double> >());
  338. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<float> >());
  339. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<long> >())
  340. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<unsigned long> >())
  341. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<int> >());
  342. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<unsigned int> >());
  343. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<std::size_t> >());
  344. BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade<coordinate_matrix<char> >());
  345. }
  346. int main () {
  347. BOOST_UBLAS_TEST_BEGIN();
  348. BOOST_UBLAS_TEST_DO( test_matrix_row_facade );
  349. BOOST_UBLAS_TEST_DO( test_matrix_column_facade );
  350. BOOST_UBLAS_TEST_END();
  351. }