123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- // This file is part of Eigen, a lightweight C++ template library
- // for linear algebra.
- //
- // Copyright (C) 2019 David Tellenbach <david.tellenbach@tellnotes.org>
- //
- // 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/.
- #define EIGEN_NO_STATIC_ASSERT
- #include "main.h"
- template <typename Scalar>
- void assertionTest()
- {
- typedef DiagonalMatrix<Scalar, 5> DiagMatrix5;
- typedef DiagonalMatrix<Scalar, 7> DiagMatrix7;
- typedef DiagonalMatrix<Scalar, Dynamic> DiagMatrixX;
- Scalar raw[6];
- for (int i = 0; i < 6; ++i) {
- raw[i] = internal::random<Scalar>();
- }
- VERIFY_RAISES_ASSERT((DiagMatrix5{raw[0], raw[1], raw[2], raw[3]}));
- VERIFY_RAISES_ASSERT((DiagMatrix5{raw[0], raw[1], raw[3]}));
- VERIFY_RAISES_ASSERT((DiagMatrix7{raw[0], raw[1], raw[2], raw[3]}));
- VERIFY_RAISES_ASSERT((DiagMatrixX {
- {raw[0], raw[1], raw[2]},
- {raw[3], raw[4], raw[5]}
- }));
- }
- #define VERIFY_IMPLICIT_CONVERSION_3(DIAGTYPE, V0, V1, V2) \
- DIAGTYPE d(V0, V1, V2); \
- DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
- VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \
- VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \
- VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2);
- #define VERIFY_IMPLICIT_CONVERSION_4(DIAGTYPE, V0, V1, V2, V3) \
- DIAGTYPE d(V0, V1, V2, V3); \
- DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
- VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \
- VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \
- VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2); \
- VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3);
- #define VERIFY_IMPLICIT_CONVERSION_5(DIAGTYPE, V0, V1, V2, V3, V4) \
- DIAGTYPE d(V0, V1, V2, V3, V4); \
- DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
- VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \
- VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \
- VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2); \
- VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3); \
- VERIFY_IS_APPROX(Dense(4, 4), (Scalar)V4);
- template<typename Scalar>
- void constructorTest()
- {
- typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0;
- typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3;
- typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4;
- typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX;
- Scalar raw[7];
- for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>();
- // Fixed-sized matrices
- {
- DiagonalMatrix0 a {{}};
- VERIFY(a.rows() == 0);
- VERIFY(a.cols() == 0);
- typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- {
- DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}};
- VERIFY(a.rows() == 3);
- VERIFY(a.cols() == 3);
- typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- {
- DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}};
- VERIFY(a.rows() == 4);
- VERIFY(a.cols() == 4);
- typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- // dynamically sized matrices
- {
- DiagonalMatrixX a{{}};
- VERIFY(a.rows() == 0);
- VERIFY(a.rows() == 0);
- typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- {
- DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}};
- VERIFY(a.rows() == 7);
- VERIFY(a.rows() == 7);
- typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- }
- template<>
- void constructorTest<float>()
- {
- typedef float Scalar;
- typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0;
- typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3;
- typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4;
- typedef DiagonalMatrix<Scalar, 5> DiagonalMatrix5;
- typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX;
- Scalar raw[7];
- for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>();
- // Fixed-sized matrices
- {
- DiagonalMatrix0 a {{}};
- VERIFY(a.rows() == 0);
- VERIFY(a.cols() == 0);
- typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- {
- DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}};
- VERIFY(a.rows() == 3);
- VERIFY(a.cols() == 3);
- typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- {
- DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}};
- VERIFY(a.rows() == 4);
- VERIFY(a.cols() == 4);
- typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- // dynamically sized matrices
- {
- DiagonalMatrixX a{{}};
- VERIFY(a.rows() == 0);
- VERIFY(a.rows() == 0);
- typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- {
- DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}};
- VERIFY(a.rows() == 7);
- VERIFY(a.rows() == 7);
- typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
- for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
- }
- { VERIFY_IMPLICIT_CONVERSION_3(DiagonalMatrix3, 1.2647, 2.56f, -3); }
- { VERIFY_IMPLICIT_CONVERSION_4(DiagonalMatrix4, 1.2647, 2.56f, -3, 3.23f); }
- { VERIFY_IMPLICIT_CONVERSION_5(DiagonalMatrix5, 1.2647, 2.56f, -3, 3.23f, 2); }
- }
- EIGEN_DECLARE_TEST(diagonal_matrix_variadic_ctor)
- {
- CALL_SUBTEST_1(assertionTest<unsigned char>());
- CALL_SUBTEST_1(assertionTest<float>());
- CALL_SUBTEST_1(assertionTest<Index>());
- CALL_SUBTEST_1(assertionTest<int>());
- CALL_SUBTEST_1(assertionTest<long int>());
- CALL_SUBTEST_1(assertionTest<std::ptrdiff_t>());
- CALL_SUBTEST_1(assertionTest<std::complex<double>>());
- CALL_SUBTEST_2(constructorTest<unsigned char>());
- CALL_SUBTEST_2(constructorTest<float>());
- CALL_SUBTEST_2(constructorTest<Index>());
- CALL_SUBTEST_2(constructorTest<int>());
- CALL_SUBTEST_2(constructorTest<long int>());
- CALL_SUBTEST_2(constructorTest<std::ptrdiff_t>());
- CALL_SUBTEST_2(constructorTest<std::complex<double>>());
- }
|