diff options
-rw-r--r-- | src/Core/Matrix.h | 56 | ||||
-rw-r--r-- | src/Core/MatrixBase.h | 10 | ||||
-rw-r--r-- | src/Core/MatrixStorage.h | 3 | ||||
-rw-r--r-- | test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/main.h | 1 | ||||
-rw-r--r-- | test/smallvectors.cpp | 62 |
6 files changed, 127 insertions, 6 deletions
diff --git a/src/Core/Matrix.h b/src/Core/Matrix.h index cd71b50c5..615166876 100644 --- a/src/Core/Matrix.h +++ b/src/Core/Matrix.h @@ -90,11 +90,61 @@ class Matrix : public MatrixBase<_Scalar, Matrix<_Scalar, _Rows, _Cols> >, || (ColsAtCompileTime == 1 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == dim))); } - explicit Matrix(int rows, int cols) : Storage(rows, cols) + + // this constructor is very tricky. + // When Matrix is a fixed-size vector type of size 2, + // Matrix(x,y) should mean "construct vector with coefficients x,y". + // Otherwise, Matrix(x,y) should mean "construct matrix with x rows and y cols". + // Note that in the case of fixed-size, Storage::Storage(int,int) does nothing, + // so it is harmless to call it and afterwards we just fill the m_data array + // with the two coefficients. In the case of dynamic size, Storage::Storage(int,int) + // does what we want to, so it only remains to add some asserts. + Matrix(int x, int y) : Storage(x, y) + { + if((RowsAtCompileTime == 1 && ColsAtCompileTime == 2) + || (RowsAtCompileTime == 2 && ColsAtCompileTime == 1)) + { + (Storage::m_data)[0] = x; + (Storage::m_data)[1] = y; + } + else + { + assert(x > 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == x) + && y > 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == y)); + } + } + Matrix(const float& x, const float& y) + { + assert((RowsAtCompileTime == 1 && ColsAtCompileTime == 2) + || (RowsAtCompileTime == 2 && ColsAtCompileTime == 1)); + (Storage::m_data)[0] = x; + (Storage::m_data)[1] = y; + } + Matrix(const double& x, const double& y) { - assert(rows > 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) - && cols > 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols)); + assert((RowsAtCompileTime == 1 && ColsAtCompileTime == 2) + || (RowsAtCompileTime == 2 && ColsAtCompileTime == 1)); + (Storage::m_data)[0] = x; + (Storage::m_data)[1] = y; } + Matrix(const Scalar& x, const Scalar& y, const Scalar& z) + { + assert((RowsAtCompileTime == 1 && ColsAtCompileTime == 3) + || (RowsAtCompileTime == 3 && ColsAtCompileTime == 1)); + (Storage::m_data)[0] = x; + (Storage::m_data)[1] = y; + (Storage::m_data)[2] = z; + } + Matrix(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w) + { + assert((RowsAtCompileTime == 1 && ColsAtCompileTime == 4) + || (RowsAtCompileTime == 4 && ColsAtCompileTime == 1)); + (Storage::m_data)[0] = x; + (Storage::m_data)[1] = y; + (Storage::m_data)[2] = z; + (Storage::m_data)[3] = w; + } + template<typename OtherDerived> Matrix(const MatrixBase<Scalar, OtherDerived>& other) : Storage(other.rows(), other.cols()) diff --git a/src/Core/MatrixBase.h b/src/Core/MatrixBase.h index cf4b31be2..f0d0221da 100644 --- a/src/Core/MatrixBase.h +++ b/src/Core/MatrixBase.h @@ -186,6 +186,16 @@ template<typename Scalar, typename Derived> class MatrixBase } Scalar& operator[](int index) { return coeffRef(index, UserDebugging); } + Scalar x() const { return coeff(0, UserDebugging); } + Scalar y() const { return coeff(1, UserDebugging); } + Scalar z() const { return coeff(2, UserDebugging); } + Scalar w() const { return coeff(3, UserDebugging); } + Scalar& x() { return coeffRef(0, UserDebugging); } + Scalar& y() { return coeffRef(1, UserDebugging); } + Scalar& z() { return coeffRef(2, UserDebugging); } + Scalar& w() { return coeffRef(3, UserDebugging); } + + Eval<Derived> eval() const EIGEN_ALWAYS_INLINE; }; diff --git a/src/Core/MatrixStorage.h b/src/Core/MatrixStorage.h index 1e4b0a21f..112d904b9 100644 --- a/src/Core/MatrixStorage.h +++ b/src/Core/MatrixStorage.h @@ -49,11 +49,8 @@ class MatrixStorage public: MatrixStorage() {} - MatrixStorage(int) {} - MatrixStorage(int, int) {} - ~MatrixStorage() {}; }; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c58b085c7..72a9f8fb7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -10,6 +10,7 @@ SET(test_SRCS adjoint.cpp submatrices.cpp miscmatrices.cpp + smallvectors.cpp ) QT4_AUTOMOC(${test_SRCS}) diff --git a/test/main.h b/test/main.h index cb387e08e..29a56b973 100644 --- a/test/main.h +++ b/test/main.h @@ -117,6 +117,7 @@ class EigenTest : public QObject void testAdjoint(); void testSubmatrices(); void testMiscMatrices(); + void testSmallVectors(); protected: int m_repeat; }; diff --git a/test/smallvectors.cpp b/test/smallvectors.cpp new file mode 100644 index 000000000..e05937e2f --- /dev/null +++ b/test/smallvectors.cpp @@ -0,0 +1,62 @@ +// 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 <jacob@math.jussieu.fr> +// +// 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" + +namespace Eigen { + +template<typename Scalar> void smallVectors() +{ + typedef Matrix<Scalar, 1, 2> V2; + typedef Matrix<Scalar, 3, 1> V3; + typedef Matrix<Scalar, 1, 4> V4; + Scalar x1 = random<Scalar>(), + x2 = random<Scalar>(), + x3 = random<Scalar>(), + x4 = random<Scalar>(); + V2 v2(x1, x2); + V3 v3(x1, x2, x3); + V4 v4(x1, x2, x3, x4); + VERIFY_IS_APPROX(x1, v2.x()); + VERIFY_IS_APPROX(x1, v3.x()); + VERIFY_IS_APPROX(x1, v4.x()); + VERIFY_IS_APPROX(x2, v2.y()); + VERIFY_IS_APPROX(x2, v3.y()); + VERIFY_IS_APPROX(x2, v4.y()); + VERIFY_IS_APPROX(x3, v3.z()); + VERIFY_IS_APPROX(x3, v4.z()); + VERIFY_IS_APPROX(x4, v4.w()); +} + +void EigenTest::testSmallVectors() +{ + for(int i = 0; i < m_repeat; i++) { + smallVectors<int>(); + smallVectors<float>(); + smallVectors<double>(); + } +} + +} // namespace Eigen |