diff options
author | yoco <peter.xiau@gmail.com> | 2014-01-18 16:10:46 +0800 |
---|---|---|
committer | yoco <peter.xiau@gmail.com> | 2014-01-18 16:10:46 +0800 |
commit | 150796337ad50cc51a4975425b287f95a5368378 (patch) | |
tree | bec2286b8b49d0439de0b0cee8485bd3abf98b5f | |
parent | 497a7b0ce1afd6d596ffe9520e5181f371ef6612 (diff) |
Add unit-test for reshape
- add unittest for dynamic & fixed-size reshape
- fix fixed-size reshape bugs bugs found while testing
-rw-r--r-- | Eigen/src/Core/Reshape.h | 17 | ||||
-rw-r--r-- | test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/reshape.cpp | 58 |
3 files changed, 68 insertions, 8 deletions
diff --git a/Eigen/src/Core/Reshape.h b/Eigen/src/Core/Reshape.h index 896392798..a773342ad 100644 --- a/Eigen/src/Core/Reshape.h +++ b/Eigen/src/Core/Reshape.h @@ -3,6 +3,7 @@ // // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com> +// Copyright (C) 2014 yoco <peter.xiau@gmail.com> // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed @@ -242,8 +243,8 @@ template<typename XprType, int ReshapeRows, int ReshapeCols, bool InnerPanel, bo inline Scalar& coeffRef(Index index) { EIGEN_STATIC_ASSERT_LVALUE(XprType) - const RowCol row_col = index_remap((RowsAtCompileTime == 1 ? 0 : index) - (RowsAtCompileTime == 1 ? index : 0)); + const RowCol row_col = index_remap(RowsAtCompileTime == 1 ? 0 : index, + RowsAtCompileTime == 1 ? index : 0); return m_xpr.const_cast_derived().coeffRef(row_col.first, row_col.second); } @@ -251,16 +252,16 @@ template<typename XprType, int ReshapeRows, int ReshapeCols, bool InnerPanel, bo EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index index) const { - const RowCol row_col = index_remap((RowsAtCompileTime == 1 ? 0 : index) - (RowsAtCompileTime == 1 ? index : 0)); + const RowCol row_col = index_remap(RowsAtCompileTime == 1 ? 0 : index, + RowsAtCompileTime == 1 ? index : 0); return m_xpr.const_cast_derived().coeffRef(row_col.first, row_col.second); } EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const { - const RowCol row_col = index_remap((RowsAtCompileTime == 1 ? 0 : index) - (RowsAtCompileTime == 1 ? index : 0)); + const RowCol row_col = index_remap(RowsAtCompileTime == 1 ? 0 : index, + RowsAtCompileTime == 1 ? index : 0); return m_xpr.coeff(row_col.first, row_col.second); } @@ -285,7 +286,7 @@ template<typename XprType, int ReshapeRows, int ReshapeCols, bool InnerPanel, bo inline PacketScalar packet(Index index) const { const RowCol row_col = index_remap(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0); + RowsAtCompileTime == 1 ? index : 0); return m_xpr.template packet<Unaligned>(row_col.first, row_col.second); } @@ -293,7 +294,7 @@ template<typename XprType, int ReshapeRows, int ReshapeCols, bool InnerPanel, bo inline void writePacket(Index index, const PacketScalar& val) { const RowCol row_col = index_remap(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0); + RowsAtCompileTime == 1 ? index : 0); return m_xpr.template packet<Unaligned>(row_col.first, row_col.second, val); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3c32f4b21..238298d43 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -150,6 +150,7 @@ ei_add_test(exceptions) ei_add_test(redux) ei_add_test(visitor) ei_add_test(block) +ei_add_test(reshape) ei_add_test(corners) ei_add_test(product_small) ei_add_test(product_large) diff --git a/test/reshape.cpp b/test/reshape.cpp new file mode 100644 index 000000000..87ffc835b --- /dev/null +++ b/test/reshape.cpp @@ -0,0 +1,58 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2014 yoco <peter.xiau@gmail.com> +// +// This Source Code Form is subject to the terms of the Mozilla +// Public License v. 2.0. If a copy of the MPL was not distributed +// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include "main.h" + +using Eigen::Map; +using Eigen::MatrixXi; + +void dynamic_reshape_all_size(int row, int col) { + // create matrix(row, col) and filled with 0, 1, 2, ... + Eigen::MatrixXi m(row, col); + for(int r = 0; r < row; ++r) + for(int c = 0; c < col; ++c) + m(r, c) = col * c + r; + + // for all possible shape + for(int new_r = 1; new_r <= row * col; ++new_r) { + // skip invalid shape + if(row * col % new_r != 0) + continue; + + // reshape and compare + int new_c = row * col / new_r; + VERIFY_IS_EQUAL(m.reshape(new_r, new_c), + Map<MatrixXi>(m.data(), new_r, new_c)); + } +} + +// just test a 4x4 matrix, enumerate all combination manually, +// so I don't have to do template-meta-programming here. +void static_reshape_all_size() { + // create matrix(row, col) and filled with 0, 1, 2, ... + int row = 4; + int col = 4; + Eigen::MatrixXi m(row, col); + for(int r = 0; r < row; ++r) + for(int c = 0; c < col; ++c) + m(r, c) = col * c + r; + + // reshape and compare + VERIFY_IS_EQUAL((m.reshape< 1, 16>()), Map<MatrixXi>(m.data(), 1, 16)); + VERIFY_IS_EQUAL((m.reshape< 2, 8>()), Map<MatrixXi>(m.data(), 2, 8)); + VERIFY_IS_EQUAL((m.reshape< 4, 4>()), Map<MatrixXi>(m.data(), 4, 4)); + VERIFY_IS_EQUAL((m.reshape< 8, 2>()), Map<MatrixXi>(m.data(), 8, 2)); + VERIFY_IS_EQUAL((m.reshape<16, 1>()), Map<MatrixXi>(m.data(), 16, 1)); +} + +void test_reshape() +{ + CALL_SUBTEST(dynamic_reshape_all_size(4, 4)); + CALL_SUBTEST(static_reshape_all_size()); +} |