diff --git a/src/Core/MatrixBase.h b/src/Core/MatrixBase.h index 7928b8578..7f1a34b44 100644 --- a/src/Core/MatrixBase.h +++ b/src/Core/MatrixBase.h @@ -23,8 +23,8 @@ // License. This exception does not invalidate any other reasons why a work // based on this file might be covered by the GNU General Public License. -#ifndef EIGEN_OBJECT_H -#define EIGEN_OBJECT_H +#ifndef EIGEN_MATRIXBASE_H +#define EIGEN_MATRIXBASE_H template class MatrixBase { @@ -197,4 +197,4 @@ std::ostream & operator << return s; } -#endif // EIGEN_OBJECT_H +#endif // EIGEN_MATRIXBASE_H diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a60c0bf26..5680fef9b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,6 +7,7 @@ INCLUDE_DIRECTORIES( ${QT_INCLUDE_DIR} ) SET(test_SRCS main.cpp basicstuff.cpp + adjoint.cpp ) QT4_AUTOMOC(${test_SRCS}) diff --git a/test/adjoint.cpp b/test/adjoint.cpp new file mode 100644 index 000000000..046bbbc5b --- /dev/null +++ b/test/adjoint.cpp @@ -0,0 +1,94 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. Eigen itself is part of the KDE project. +// +// Copyright (C) 2006-2007 Benoit Jacob +// +// Eigen is free software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2 or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along +// with Eigen; if not, write to the Free Software Foundation, Inc., 51 +// Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. This exception does not invalidate any other reasons why a work +// based on this file might be covered by the GNU General Public License. + +#include "main.h" + +template void adjoint(const MatrixType& m) +{ + /* this test covers the following files: + Transpose.h Conjugate.h Dot.h + */ + + typedef typename MatrixType::Scalar Scalar; + typedef Matrix VectorType; + int rows = m.rows(); + int cols = m.cols(); + + MatrixType m1 = MatrixType::random(rows, cols), + m2 = MatrixType::random(rows, cols), + m3(rows, cols), + mzero = MatrixType::zero(rows, cols), + identity = Matrix + ::identity(rows), + square = Matrix + ::random(rows, rows); + VectorType v1 = VectorType::random(rows), + v2 = VectorType::random(rows), + v3 = VectorType::random(rows), + vzero = VectorType::zero(rows); + + Scalar s1 = NumTraits::random(), + s2 = NumTraits::random(); + + // check involutivity of adjoint, transpose, conjugate + QVERIFY(m1.transpose().transpose().isApprox(m1)); + QVERIFY(m1.conjugate().conjugate().isApprox(m1)); + QVERIFY(m1.adjoint().adjoint().isApprox(m1)); + + // check basic compatibility of adjoint, transpose, conjugate + QVERIFY(m1.transpose().conjugate().adjoint().isApprox(m1)); + QVERIFY(m1.adjoint().conjugate().transpose().isApprox(m1)); + if(!NumTraits::IsComplex) QVERIFY(m1.adjoint().transpose().isApprox(m1)); + + // check multiplicative behavior + QVERIFY((m1.transpose() * m2).transpose().isApprox(m2.transpose() * m1)); + QVERIFY((m1.adjoint() * m2).adjoint().isApprox(m2.adjoint() * m1)); + QVERIFY((m1.transpose() * m2).conjugate().isApprox(m1.adjoint() * m2.conjugate())); + QVERIFY((s1 * m1).transpose().isApprox(s1 * m1.transpose())); + QVERIFY((s1 * m1).conjugate().isApprox(NumTraits::conj(s1) * m1.conjugate())); + QVERIFY((s1 * m1).adjoint().isApprox(NumTraits::conj(s1) * m1.adjoint())); + + // check basic properties of dot, norm, norm2 + typedef typename NumTraits::Real RealScalar; + QVERIFY(NumTraits::isApprox((s1 * v1 + s2 * v2).dot(v3), s1 * v1.dot(v3) + s2 * v2.dot(v3))); + QVERIFY(NumTraits::isApprox(v3.dot(s1 * v1 + s2 * v2), NumTraits::conj(s1) * v3.dot(v1) + NumTraits::conj(s2) * v3.dot(v2))); + QVERIFY(NumTraits::isApprox(NumTraits::conj(v1.dot(v2)), v2.dot(v1))); + QVERIFY(NumTraits::isApprox(abs(v1.dot(v1)), v1.norm2())); + if(NumTraits::HasFloatingPoint) QVERIFY(NumTraits::isApprox(v1.norm2(), v1.norm() * v1.norm())); + QVERIFY(NumTraits::isMuchSmallerThan(abs(vzero.dot(v1)), 1)); + QVERIFY(NumTraits::isMuchSmallerThan(vzero.norm(), 1)); + + // check compatibility of dot and adjoint + QVERIFY(NumTraits::isApprox(v1.dot(square * v2), (square.adjoint() * v1).dot(v2))); +} + +void EigenTest::testAdjoint() +{ + adjoint(Matrix()); + adjoint(Matrix, 4, 4>()); + adjoint(MatrixXcf(3, 3)); + adjoint(MatrixXi(8, 12)); + adjoint(MatrixXd(20, 20)); +} diff --git a/test/basicstuff.cpp b/test/basicstuff.cpp index 08e75db06..d929b0883 100644 --- a/test/basicstuff.cpp +++ b/test/basicstuff.cpp @@ -111,6 +111,9 @@ template void basicStuff(const MatrixType& m) QVERIFY((s1 * (square * m1)).isApprox((s1 * square) * m1)); QVERIFY((s1 * (square * m1)).isApprox(square * (m1 * s1))); + // continue testing Product.h: lazyProduct + QVERIFY(square.lazyProduct(m1).isApprox(square * m1)); + // test Product.h together with Identity.h. This does test Identity.h. QVERIFY(m1.isApprox(identity * m1)); QVERIFY(v1.isApprox(identity * v1)); diff --git a/test/main.h b/test/main.h index 013abf595..c752b6ec6 100644 --- a/test/main.h +++ b/test/main.h @@ -45,6 +45,7 @@ class EigenTest : public QObject private slots: void testBasicStuff(); + void testAdjoint(); }; #endif // EIGEN_TEST_MAIN_H