Brian Silverman | 72890c2 | 2015-09-19 14:37:37 -0400 | [diff] [blame] | 1 | // This file is part of Eigen, a lightweight C++ template library |
| 2 | // for linear algebra. |
| 3 | // |
| 4 | // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> |
| 5 | // |
| 6 | // This Source Code Form is subject to the terms of the Mozilla |
| 7 | // Public License v. 2.0. If a copy of the MPL was not distributed |
| 8 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| 9 | |
| 10 | #include "main.h" |
| 11 | |
Austin Schuh | 189376f | 2018-12-20 22:11:15 +1100 | [diff] [blame^] | 12 | |
| 13 | template<int M1, int M2, int N1, int N2> |
| 14 | void test_blocks() |
| 15 | { |
| 16 | Matrix<int, M1+M2, N1+N2> m_fixed; |
| 17 | MatrixXi m_dynamic(M1+M2, N1+N2); |
| 18 | |
| 19 | Matrix<int, M1, N1> mat11; mat11.setRandom(); |
| 20 | Matrix<int, M1, N2> mat12; mat12.setRandom(); |
| 21 | Matrix<int, M2, N1> mat21; mat21.setRandom(); |
| 22 | Matrix<int, M2, N2> mat22; mat22.setRandom(); |
| 23 | |
| 24 | MatrixXi matx11 = mat11, matx12 = mat12, matx21 = mat21, matx22 = mat22; |
| 25 | |
| 26 | { |
| 27 | VERIFY_IS_EQUAL((m_fixed << mat11, mat12, mat21, matx22).finished(), (m_dynamic << mat11, matx12, mat21, matx22).finished()); |
| 28 | VERIFY_IS_EQUAL((m_fixed.template topLeftCorner<M1,N1>()), mat11); |
| 29 | VERIFY_IS_EQUAL((m_fixed.template topRightCorner<M1,N2>()), mat12); |
| 30 | VERIFY_IS_EQUAL((m_fixed.template bottomLeftCorner<M2,N1>()), mat21); |
| 31 | VERIFY_IS_EQUAL((m_fixed.template bottomRightCorner<M2,N2>()), mat22); |
| 32 | VERIFY_IS_EQUAL((m_fixed << mat12, mat11, matx21, mat22).finished(), (m_dynamic << mat12, matx11, matx21, mat22).finished()); |
| 33 | } |
| 34 | |
| 35 | if(N1 > 0) |
| 36 | { |
| 37 | VERIFY_RAISES_ASSERT((m_fixed << mat11, mat12, mat11, mat21, mat22)); |
| 38 | VERIFY_RAISES_ASSERT((m_fixed << mat11, mat12, mat21, mat21, mat22)); |
| 39 | } |
| 40 | else |
| 41 | { |
| 42 | // allow insertion of zero-column blocks: |
| 43 | VERIFY_IS_EQUAL((m_fixed << mat11, mat12, mat11, mat11, mat21, mat21, mat22).finished(), (m_dynamic << mat12, mat22).finished()); |
| 44 | } |
| 45 | if(M1 != M2) |
| 46 | { |
| 47 | VERIFY_RAISES_ASSERT((m_fixed << mat11, mat21, mat12, mat22)); |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | |
| 52 | template<int N> |
| 53 | struct test_block_recursion |
| 54 | { |
| 55 | static void run() |
| 56 | { |
| 57 | test_blocks<(N>>6)&3, (N>>4)&3, (N>>2)&3, N & 3>(); |
| 58 | test_block_recursion<N-1>::run(); |
| 59 | } |
| 60 | }; |
| 61 | |
| 62 | template<> |
| 63 | struct test_block_recursion<-1> |
| 64 | { |
| 65 | static void run() { } |
| 66 | }; |
| 67 | |
Brian Silverman | 72890c2 | 2015-09-19 14:37:37 -0400 | [diff] [blame] | 68 | void test_commainitializer() |
| 69 | { |
| 70 | Matrix3d m3; |
| 71 | Matrix4d m4; |
| 72 | |
| 73 | VERIFY_RAISES_ASSERT( (m3 << 1, 2, 3, 4, 5, 6, 7, 8) ); |
| 74 | |
| 75 | #ifndef _MSC_VER |
| 76 | VERIFY_RAISES_ASSERT( (m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ); |
| 77 | #endif |
| 78 | |
| 79 | double data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; |
| 80 | Matrix3d ref = Map<Matrix<double,3,3,RowMajor> >(data); |
| 81 | |
| 82 | m3 = Matrix3d::Random(); |
| 83 | m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9; |
| 84 | VERIFY_IS_APPROX(m3, ref ); |
| 85 | |
| 86 | Vector3d vec[3]; |
| 87 | vec[0] << 1, 4, 7; |
| 88 | vec[1] << 2, 5, 8; |
| 89 | vec[2] << 3, 6, 9; |
| 90 | m3 = Matrix3d::Random(); |
| 91 | m3 << vec[0], vec[1], vec[2]; |
| 92 | VERIFY_IS_APPROX(m3, ref); |
| 93 | |
| 94 | vec[0] << 1, 2, 3; |
| 95 | vec[1] << 4, 5, 6; |
| 96 | vec[2] << 7, 8, 9; |
| 97 | m3 = Matrix3d::Random(); |
| 98 | m3 << vec[0].transpose(), |
| 99 | 4, 5, 6, |
| 100 | vec[2].transpose(); |
| 101 | VERIFY_IS_APPROX(m3, ref); |
Austin Schuh | 189376f | 2018-12-20 22:11:15 +1100 | [diff] [blame^] | 102 | |
| 103 | |
| 104 | // recursively test all block-sizes from 0 to 3: |
| 105 | test_block_recursion<(1<<8) - 1>(); |
Brian Silverman | 72890c2 | 2015-09-19 14:37:37 -0400 | [diff] [blame] | 106 | } |