diff options
-rw-r--r-- | Eigen/Core/Block.h | 34 | ||||
-rw-r--r-- | Eigen/Core/Cast.h | 30 | ||||
-rw-r--r-- | Eigen/Core/Coeffs.h | 174 | ||||
-rw-r--r-- | Eigen/Core/Column.h | 28 | ||||
-rw-r--r-- | Eigen/Core/DynBlock.h | 17 | ||||
-rw-r--r-- | Eigen/Core/MatrixBase.h | 31 | ||||
-rw-r--r-- | Eigen/Core/OperatorEquals.h | 79 | ||||
-rw-r--r-- | Eigen/Core/Row.h | 28 | ||||
-rw-r--r-- | Eigen/Core/Util.h | 17 | ||||
-rw-r--r-- | doc/Doxyfile.in | 36 | ||||
-rw-r--r-- | doc/benchmark.cpp | 2 | ||||
-rw-r--r-- | doc/example.cpp | 6 | ||||
-rw-r--r-- | doc/examples/class_Block.cpp | 23 | ||||
-rw-r--r-- | doc/examples/class_Cast.cpp | 23 | ||||
-rw-r--r-- | doc/examples/class_Column.cpp | 19 | ||||
-rw-r--r-- | doc/examples/class_DynBlock.cpp | 4 | ||||
-rw-r--r-- | doc/examples/class_Row.cpp | 19 | ||||
-rw-r--r-- | doc/snippets/MatrixBase_block.cpp | 3 | ||||
-rw-r--r-- | doc/snippets/MatrixBase_cast.cpp | 3 | ||||
-rw-r--r-- | doc/snippets/MatrixBase_col.cpp | 3 | ||||
-rw-r--r-- | doc/snippets/MatrixBase_dynBlock.cpp | 4 | ||||
-rw-r--r-- | doc/snippets/MatrixBase_row.cpp | 3 | ||||
-rw-r--r-- | doc/snippets/compile_snippet.cpp.in | 2 | ||||
-rw-r--r-- | doc/tutorial.cpp | 2 |
24 files changed, 482 insertions, 108 deletions
diff --git a/Eigen/Core/Block.h b/Eigen/Core/Block.h index 54a93b40f..7dbd14e5c 100644 --- a/Eigen/Core/Block.h +++ b/Eigen/Core/Block.h @@ -26,6 +26,28 @@ #ifndef EIGEN_BLOCK_H #define EIGEN_BLOCK_H +/** \class Block + * + * \brief Expression of a fixed-size block + * + * \param MatrixType the type of the object in which we are taking a block + * \param BlockRows the number of rows of the block we are taking + * \param BlockCols the number of columns of the block we are taking + * + * This class represents an expression of a fixed-size block. It is the return + * type of MatrixBase::block() and most of the time this is the only way it + * is used. + * + * However, if you want to directly maniputate fixed-size block expressions, + * for instance if you want to write a function returning such an expression, you + * will need to use this class. + * + * Here is an example illustrating this: + * \include class_Block.cpp + * Output: \verbinclude class_Block.out + * + * \sa MatrixBase::block(), class DynBlock + */ template<typename MatrixType, int BlockRows, int BlockCols> class Block : public MatrixBase<typename MatrixType::Scalar, Block<MatrixType, BlockRows, BlockCols> > @@ -71,6 +93,18 @@ template<typename MatrixType, int BlockRows, int BlockCols> class Block const int m_startRow, m_startCol; }; +/** \returns a fixed-size expression of a block in *this. + * + * \param blockRows the number of rows in the block + * \param blockCols the number of columns in the block + * \param startRow the first row in the block + * \param startCol the first column in the block + * + * Example: \include MatrixBase_block.cpp + * Output: \verbinclude MatrixBase_block.out + * + * \sa class Block, dynBlock() + */ template<typename Scalar, typename Derived> template<int BlockRows, int BlockCols> Block<Derived, BlockRows, BlockCols> MatrixBase<Scalar, Derived> diff --git a/Eigen/Core/Cast.h b/Eigen/Core/Cast.h index 4d6a30159..36886200b 100644 --- a/Eigen/Core/Cast.h +++ b/Eigen/Core/Cast.h @@ -26,6 +26,26 @@ #ifndef EIGEN_CAST_H #define EIGEN_CAST_H +/** \class Cast + * + * \brief Expression with casted scalar type + * + * \param NewScalar the new scalar type + * \param MatrixType the type of the object in which we are casting the scalar type + * + * This class represents an expression where we are casting the scalar type to a new + * type. It is the return type of MatrixBase::cast() and most of the time this is the + * only way it is used. + * + * However, if you want to write a function returning such an expression, you + * will need to use this class. + * + * Here is an example illustrating this: + * \include class_Cast.cpp + * Output: \verbinclude class_Cast.out + * + * \sa MatrixBase::cast() + */ template<typename NewScalar, typename MatrixType> class Cast : NoOperatorEquals, public MatrixBase<NewScalar, Cast<NewScalar, MatrixType> > { @@ -56,7 +76,15 @@ template<typename NewScalar, typename MatrixType> class Cast : NoOperatorEquals, }; /** \returns an expression of *this with the \a Scalar type casted to - * \a NewScalar. */ + * \a NewScalar. + * + * \param NewScalar the type we are casting the scalars to + * + * Example: \include MatrixBase_cast.cpp + * Output: \verbinclude MatrixBase_cast.out + * + * \sa class Cast + */ template<typename Scalar, typename Derived> template<typename NewScalar> const Cast<NewScalar, Derived> diff --git a/Eigen/Core/Coeffs.h b/Eigen/Core/Coeffs.h index d20da2a27..fa8f44935 100644 --- a/Eigen/Core/Coeffs.h +++ b/Eigen/Core/Coeffs.h @@ -26,105 +26,225 @@ #ifndef EIGEN_COEFFS_H #define EIGEN_COEFFS_H +/** Short version: don't use this function, use + * \link operator()(int,int) const \endlink instead. + * + * Long version: this function is similar to + * \link operator()(int,int) const \endlink, but without the assertion. + * Use this for limiting the performance cost of debugging code when doing + * repeated coefficient access. Only use this when it is guaranteed that the + * parameters \a row and \a col are in range. + * + * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this + * function equivalent to \link operator()(int,int) const \endlink. + * + * \sa operator()(int,int) const, coeffRef(int,int), coeff(int) const + */ template<typename Scalar, typename Derived> Scalar MatrixBase<Scalar, Derived> - ::coeff(int row, int col, AssertLevel assertLevel = InternalDebugging) const + ::coeff(int row, int col) const { - eigen_assert(assertLevel, row >= 0 && row < rows() - && col >= 0 && col < cols()); + eigen_internal_assert(row >= 0 && row < rows() + && col >= 0 && col < cols()); return static_cast<const Derived *>(this)->_coeff(row, col); } +/** \returns the coefficient at given the given row and column. + * + * \sa operator()(int,int), operator[](int) const + */ template<typename Scalar, typename Derived> Scalar MatrixBase<Scalar, Derived> - ::operator()(int row, int col) const { return coeff(row, col, UserDebugging); } + ::operator()(int row, int col) const +{ + assert(row >= 0 && row < rows() + && col >= 0 && col < cols()); + return static_cast<const Derived *>(this)->_coeff(row, col); +} +/** Short version: don't use this function, use + * \link operator()(int,int) \endlink instead. + * + * Long version: this function is similar to + * \link operator()(int,int) \endlink, but without the assertion. + * Use this for limiting the performance cost of debugging code when doing + * repeated coefficient access. Only use this when it is guaranteed that the + * parameters \a row and \a col are in range. + * + * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this + * function equivalent to \link operator()(int,int) \endlink. + * + * \sa operator()(int,int), coeff(int, int) const, coeffRef(int) + */ template<typename Scalar, typename Derived> Scalar& MatrixBase<Scalar, Derived> - ::coeffRef(int row, int col, AssertLevel assertLevel = InternalDebugging) + ::coeffRef(int row, int col) { - eigen_assert(assertLevel, row >= 0 && row < rows() - && col >= 0 && col < cols()); + eigen_internal_assert(row >= 0 && row < rows() + && col >= 0 && col < cols()); return static_cast<Derived *>(this)->_coeffRef(row, col); } +/** \returns a reference to the coefficient at given the given row and column. + * + * \sa operator()(int,int) const, operator[](int) + */ template<typename Scalar, typename Derived> Scalar& MatrixBase<Scalar, Derived> - ::operator()(int row, int col) { return coeffRef(row, col, UserDebugging); } + ::operator()(int row, int col) +{ + assert(row >= 0 && row < rows() + && col >= 0 && col < cols()); + return static_cast<Derived *>(this)->_coeffRef(row, col); +} +/** Short version: don't use this function, use + * \link operator[](int) const \endlink instead. + * + * Long version: this function is similar to + * \link operator[](int) const \endlink, but without the assertion. + * Use this for limiting the performance cost of debugging code when doing + * repeated coefficient access. Only use this when it is guaranteed that the + * parameters \a row and \a col are in range. + * + * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this + * function equivalent to \link operator[](int) const \endlink. + * + * \sa operator[](int) const, coeffRef(int), coeff(int,int) const + */ template<typename Scalar, typename Derived> Scalar MatrixBase<Scalar, Derived> - ::coeff(int index, AssertLevel assertLevel = InternalDebugging) const + ::coeff(int index) const { - eigen_assert(assertLevel, IsVector); + eigen_internal_assert(IsVector); if(RowsAtCompileTime == 1) { - eigen_assert(assertLevel, index >= 0 && index < cols()); + eigen_internal_assert(index >= 0 && index < cols()); return coeff(0, index); } else { - eigen_assert(assertLevel, index >= 0 && index < rows()); + eigen_internal_assert(index >= 0 && index < rows()); return coeff(index, 0); } } +/** \returns the coefficient at given index. + * + * \only_for_vectors + * + * \sa operator[](int), operator()(int,int) const, x() const, y() const, + * z() const, w() const + */ template<typename Scalar, typename Derived> Scalar MatrixBase<Scalar, Derived> - ::operator[](int index) const { return coeff(index, UserDebugging); } + ::operator[](int index) const +{ + assert(IsVector); + if(RowsAtCompileTime == 1) + { + assert(index >= 0 && index < cols()); + return coeff(0, index); + } + else + { + assert(index >= 0 && index < rows()); + return coeff(index, 0); + } +} +/** Short version: don't use this function, use + * \link operator[](int) \endlink instead. + * + * Long version: this function is similar to + * \link operator[](int) \endlink, but without the assertion. + * Use this for limiting the performance cost of debugging code when doing + * repeated coefficient access. Only use this when it is guaranteed that the + * parameters \a row and \a col are in range. + * + * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this + * function equivalent to \link operator[](int) \endlink. + * + * \sa operator[](int), coeff(int) const, coeffRef(int,int) + */ template<typename Scalar, typename Derived> Scalar& MatrixBase<Scalar, Derived> - ::coeffRef(int index, AssertLevel assertLevel = InternalDebugging) + ::coeffRef(int index) { - eigen_assert(assertLevel, IsVector); + eigen_internal_assert(IsVector); if(RowsAtCompileTime == 1) { - eigen_assert(assertLevel, index >= 0 && index < cols()); + eigen_internal_assert(index >= 0 && index < cols()); return coeffRef(0, index); } else { - eigen_assert(assertLevel, index >= 0 && index < rows()); + eigen_internal_assert(index >= 0 && index < rows()); return coeffRef(index, 0); } } +/** \returns a reference to the coefficient at given index. + * + * \only_for_vectors + * + * \sa operator[](int) const, operator()(int,int), x(), y(), z(), w() + */ template<typename Scalar, typename Derived> Scalar& MatrixBase<Scalar, Derived> - ::operator[](int index) { return coeffRef(index, UserDebugging); } + ::operator[](int index) +{ + assert(IsVector); + if(RowsAtCompileTime == 1) + { + assert(index >= 0 && index < cols()); + return coeffRef(0, index); + } + else + { + assert(index >= 0 && index < rows()); + return coeffRef(index, 0); + } +} +/** equivalent to operator[](0). \only_for_vectors */ template<typename Scalar, typename Derived> Scalar MatrixBase<Scalar, Derived> - ::x() const { return coeff(0, UserDebugging); } + ::x() const { return (*this)[0]; } +/** equivalent to operator[](1). \only_for_vectors */ template<typename Scalar, typename Derived> Scalar MatrixBase<Scalar, Derived> - ::y() const { return coeff(1, UserDebugging); } + ::y() const { return (*this)[1]; } +/** equivalent to operator[](2). \only_for_vectors */ template<typename Scalar, typename Derived> Scalar MatrixBase<Scalar, Derived> - ::z() const { return coeff(2, UserDebugging); } + ::z() const { return (*this)[2]; } +/** equivalent to operator[](3). \only_for_vectors */ template<typename Scalar, typename Derived> Scalar MatrixBase<Scalar, Derived> - ::w() const { return coeff(3, UserDebugging); } + ::w() const { return (*this)[3]; } +/** equivalent to operator[](0). \only_for_vectors */ template<typename Scalar, typename Derived> Scalar& MatrixBase<Scalar, Derived> - ::x() { return coeffRef(0, UserDebugging); } + ::x() { return (*this)[0]; } +/** equivalent to operator[](1). \only_for_vectors */ template<typename Scalar, typename Derived> Scalar& MatrixBase<Scalar, Derived> - ::y() { return coeffRef(1, UserDebugging); } + ::y() { return (*this)[1]; } +/** equivalent to operator[](2). \only_for_vectors */ template<typename Scalar, typename Derived> Scalar& MatrixBase<Scalar, Derived> - ::z() { return coeffRef(2, UserDebugging); } + ::z() { return (*this)[2]; } +/** equivalent to operator[](3). \only_for_vectors */ template<typename Scalar, typename Derived> Scalar& MatrixBase<Scalar, Derived> - ::w() { return coeffRef(3, UserDebugging); } - + ::w() { return (*this)[3]; } #endif // EIGEN_COEFFS_H diff --git a/Eigen/Core/Column.h b/Eigen/Core/Column.h index d1d7f1453..a50be7114 100644 --- a/Eigen/Core/Column.h +++ b/Eigen/Core/Column.h @@ -26,6 +26,26 @@ #ifndef EIGEN_COLUMN_H #define EIGEN_COLUMN_H +/** \class Column + * + * \brief Expression of a column + * + * \param MatrixType the type of the object in which we are taking a column + * + * This class represents an expression of a column. It is the return + * type of MatrixBase::col() and most of the time this is the only way it + * is used. + * + * However, if you want to directly maniputate column expressions, + * for instance if you want to write a function returning such an expression, you + * will need to use this class. + * + * Here is an example illustrating this: + * \include class_Column.cpp + * Output: \verbinclude class_Column.out + * + * \sa MatrixBase::col() + */ template<typename MatrixType> class Column : public MatrixBase<typename MatrixType::Scalar, Column<MatrixType> > { @@ -67,8 +87,12 @@ template<typename MatrixType> class Column const int m_col; }; -/** \returns an expression of the \a i-th column of *this. - * \sa row(int) */ +/** \returns an expression of the \a i-th column of *this. Note that the numbering starts at 0. + * + * Example: \include MatrixBase_col.cpp + * Output: \verbinclude MatrixBase_col.out + * + * \sa row(), class Column */ template<typename Scalar, typename Derived> Column<Derived> MatrixBase<Scalar, Derived>::col(int i) const diff --git a/Eigen/Core/DynBlock.h b/Eigen/Core/DynBlock.h index cfd2cb082..2fd66746b 100644 --- a/Eigen/Core/DynBlock.h +++ b/Eigen/Core/DynBlock.h @@ -30,9 +30,11 @@ * * \brief Expression of a dynamic-size block * + * \param MatrixType the type of the object in which we are taking a block + * * This class represents an expression of a dynamic-size block. It is the return - * type of MatrixBase::dynBlock() and most of the time this is the only way this - * class is used. + * type of MatrixBase::dynBlock() and most of the time this is the only way it + * is used. * * However, if you want to directly maniputate dynamic-size block expressions, * for instance if you want to write a function returning such an expression, you @@ -40,8 +42,7 @@ * * Here is an example illustrating this: * \include class_DynBlock.cpp - * Output: - * \verbinclude class_DynBlock.out + * Output: \verbinclude class_DynBlock.out * * \sa MatrixBase::dynBlock() */ @@ -101,12 +102,10 @@ template<typename MatrixType> class DynBlock * \param blockRows the number of rows in the block * \param blockCols the number of columns in the block * - * Example: - * \include MatrixBase_dynBlock.cpp - * Output: - * \verbinclude MatrixBase_dynBlock.out + * Example: \include MatrixBase_dynBlock.cpp + * Output: \verbinclude MatrixBase_dynBlock.out * - * \sa class DynBlock + * \sa class DynBlock, block() */ template<typename Scalar, typename Derived> DynBlock<Derived> MatrixBase<Scalar, Derived> diff --git a/Eigen/Core/MatrixBase.h b/Eigen/Core/MatrixBase.h index 3cc4e5e41..85fca57af 100644 --- a/Eigen/Core/MatrixBase.h +++ b/Eigen/Core/MatrixBase.h @@ -55,12 +55,17 @@ template<typename Scalar, typename Derived> class MatrixBase { public: - /** The number of rows and of columns at compile-time. These are just - * copies of the values provided by the \a Derived type. If a value - * is not known at compile-time, it is set to the \a Dynamic constant. - * \sa rows(), cols(), SizeAtCompileTime */ - static const int RowsAtCompileTime = Derived::_RowsAtCompileTime, - ColsAtCompileTime = Derived::_ColsAtCompileTime; + /** The number of rows at compile-time. This is just a copy of the value provided + * by the \a Derived type. If a value is not known at compile-time, + * it is set to the \a Dynamic constant. + * \sa rows(), cols(), ColsAtCompileTime, SizeAtCompileTime */ + static const int RowsAtCompileTime = Derived::_RowsAtCompileTime; + + /** The number of columns at compile-time. This is just a copy of the value provided + * by the \a Derived type. If a value is not known at compile-time, + * it is set to the \a Dynamic constant. + * \sa rows(), cols(), RowsAtCompileTime, SizeAtCompileTime */ + static const int ColsAtCompileTime = Derived::_ColsAtCompileTime; /** This is equal to the number of coefficients, i.e. the number of * rows times the number of columns, or to \a Dynamic if this is not @@ -77,9 +82,9 @@ template<typename Scalar, typename Derived> class MatrixBase /** This is the "reference type" used to pass objects of type MatrixBase as arguments * to functions. If this MatrixBase type represents an expression, then \a Ref * is just this MatrixBase type itself, i.e. expressions are just passed by value - * and the compiler is supposed to be clever enough to optimize that. If, on the - * other hand, this MatrixBase type is an actual matrix or vector, then \a Ref is - * a typedef MatrixRef, which is like a reference, so that matrices and vectors + * and the compiler is usually clever enough to optimize that. If, on the + * other hand, this MatrixBase type is an actual matrix or vector type, then \a Ref is + * a typedef to MatrixRef, which works as a reference, so that matrices and vectors * are passed by reference, not by value. \sa ref()*/ typedef typename ForwardDecl<Derived>::Ref Ref; @@ -195,16 +200,16 @@ template<typename Scalar, typename Derived> class MatrixBase Derived& operator/=(const std::complex<float>& other); Derived& operator/=(const std::complex<double>& other); - Scalar coeff(int row, int col, AssertLevel assertLevel) const; + Scalar coeff(int row, int col) const; Scalar operator()(int row, int col) const; - Scalar& coeffRef(int row, int col, AssertLevel assertLevel); + Scalar& coeffRef(int row, int col); Scalar& operator()(int row, int col); - Scalar coeff(int index, AssertLevel assertLevel) const; + Scalar coeff(int index) const; Scalar operator[](int index) const; - Scalar& coeffRef(int index, AssertLevel assertLevel); + Scalar& coeffRef(int index); Scalar& operator[](int index); Scalar x() const; diff --git a/Eigen/Core/OperatorEquals.h b/Eigen/Core/OperatorEquals.h index 8206d280f..efda4c033 100644 --- a/Eigen/Core/OperatorEquals.h +++ b/Eigen/Core/OperatorEquals.h @@ -28,27 +28,27 @@ #define EIGEN_OPERATOREQUALS_H template<typename Derived1, typename Derived2, int UnrollCount, int Rows> -struct OperatorEqualsUnroller +struct MatrixOperatorEqualsUnroller { static const int col = (UnrollCount-1) / Rows; static const int row = (UnrollCount-1) % Rows; static void run(Derived1 &dst, const Derived2 &src) { - OperatorEqualsUnroller<Derived1, Derived2, UnrollCount-1, Rows>::run(dst, src); + MatrixOperatorEqualsUnroller<Derived1, Derived2, UnrollCount-1, Rows>::run(dst, src); dst.coeffRef(row, col) = src.coeff(row, col); } }; // prevent buggy user code from causing an infinite recursion template<typename Derived1, typename Derived2, int UnrollCount> -struct OperatorEqualsUnroller<Derived1, Derived2, UnrollCount, 0> +struct MatrixOperatorEqualsUnroller<Derived1, Derived2, UnrollCount, 0> { static void run(Derived1 &, const Derived2 &) {} }; template<typename Derived1, typename Derived2, int Rows> -struct OperatorEqualsUnroller<Derived1, Derived2, 1, Rows> +struct MatrixOperatorEqualsUnroller<Derived1, Derived2, 1, Rows> { static void run(Derived1 &dst, const Derived2 &src) { @@ -57,7 +57,41 @@ struct OperatorEqualsUnroller<Derived1, Derived2, 1, Rows> }; template<typename Derived1, typename Derived2, int Rows> -struct OperatorEqualsUnroller<Derived1, Derived2, Dynamic, Rows> +struct MatrixOperatorEqualsUnroller<Derived1, Derived2, Dynamic, Rows> +{ + static void run(Derived1 &, const Derived2 &) {} +}; + +template<typename Derived1, typename Derived2, int UnrollCount> +struct VectorOperatorEqualsUnroller +{ + static const int index = UnrollCount - 1; + + static void run(Derived1 &dst, const Derived2 &src) + { + VectorOperatorEqualsUnroller<Derived1, Derived2, UnrollCount-1>::run(dst, src); + dst.coeffRef(index) = src.coeff(index); + } +}; + +// prevent buggy user code from causing an infinite recursion +template<typename Derived1, typename Derived2> +struct VectorOperatorEqualsUnroller<Derived1, Derived2, 0> +{ + static void run(Derived1 &, const Derived2 &) {} +}; + +template<typename Derived1, typename Derived2> +struct VectorOperatorEqualsUnroller<Derived1, Derived2, 1> +{ + static void run(Derived1 &dst, const Derived2 &src) + { + dst.coeffRef(0) = src.coeff(0); + } +}; + +template<typename Derived1, typename Derived2> +struct VectorOperatorEqualsUnroller<Derived1, Derived2, Dynamic> { static void run(Derived1 &, const Derived2 &) {} }; @@ -67,16 +101,31 @@ template<typename OtherDerived> Derived& MatrixBase<Scalar, Derived> ::operator=(const MatrixBase<Scalar, OtherDerived>& other) { - assert(rows() == other.rows() && cols() == other.cols()); - if(EIGEN_UNROLLED_LOOPS && SizeAtCompileTime != Dynamic && SizeAtCompileTime <= 25) - OperatorEqualsUnroller - <Derived, OtherDerived, SizeAtCompileTime, RowsAtCompileTime>::run - (*static_cast<Derived*>(this), *static_cast<const OtherDerived*>(&other)); - else - for(int j = 0; j < cols(); j++) //traverse in column-dominant order - for(int i = 0; i < rows(); i++) - coeffRef(i, j) = other.coeff(i, j); - return *static_cast<Derived*>(this); + if(IsVector && OtherDerived::IsVector) // copying a vector expression into a vector + { + assert(size() == other.size()); + if(EIGEN_UNROLLED_LOOPS && SizeAtCompileTime != Dynamic && SizeAtCompileTime <= 25) + VectorOperatorEqualsUnroller + <Derived, OtherDerived, SizeAtCompileTime>::run + (*static_cast<Derived*>(this), *static_cast<const OtherDerived*>(&other)); + else + for(int i = 0; i < size(); i++) + coeffRef(i) = other.coeff(i); + return *static_cast<Derived*>(this); + } + else // all other cases (typically, but not necessarily, copying a matrix) + { + assert(rows() == other.rows() && cols() == other.cols()); + if(EIGEN_UNROLLED_LOOPS && SizeAtCompileTime != Dynamic && SizeAtCompileTime <= 25) + MatrixOperatorEqualsUnroller + <Derived, OtherDerived, SizeAtCompileTime, RowsAtCompileTime>::run + (*static_cast<Derived*>(this), *static_cast<const OtherDerived*>(&other)); + else + for(int j = 0; j < cols(); j++) //traverse in column-dominant order + for(int i = 0; i < rows(); i++) + coeffRef(i, j) = other.coeff(i, j); + return *static_cast<Derived*>(this); + } } #endif // EIGEN_OPERATOREQUALS_H diff --git a/Eigen/Core/Row.h b/Eigen/Core/Row.h index a9168bb45..84dc6f54c 100644 --- a/Eigen/Core/Row.h +++ b/Eigen/Core/Row.h @@ -26,6 +26,26 @@ #ifndef EIGEN_ROW_H #define EIGEN_ROW_H +/** \class Row + * + * \brief Expression of a row + * + * \param MatrixType the type of the object in which we are taking a row + * + * This class represents an expression of a row. It is the return + * type of MatrixBase::row() and most of the time this is the only way it + * is used. + * + * However, if you want to directly maniputate row expressions, + * for instance if you want to write a function returning such an expression, you + * will need to use this class. + * + * Here is an example illustrating this: + * \include class_Row.cpp + * Output: \verbinclude class_Row.out + * + * \sa MatrixBase::row() + */ template<typename MatrixType> class Row : public MatrixBase<typename MatrixType::Scalar, Row<MatrixType> > { @@ -75,8 +95,12 @@ template<typename MatrixType> class Row const int m_row; }; -/** \returns an expression of the \a i-th row of *this. - * \sa col(int)*/ +/** \returns an expression of the \a i-th row of *this. Note that the numbering starts at 0. + * + * Example: \include MatrixBase_row.cpp + * Output: \verbinclude MatrixBase_row.out + * + * \sa col(), class Row */ template<typename Scalar, typename Derived> Row<Derived> MatrixBase<Scalar, Derived>::row(int i) const diff --git a/Eigen/Core/Util.h b/Eigen/Core/Util.h index ad05c777c..c1576af00 100644 --- a/Eigen/Core/Util.h +++ b/Eigen/Core/Util.h @@ -34,18 +34,17 @@ #undef minor -#define USING_EIGEN_DATA_TYPES \ +#define USING_PART_OF_NAMESPACE_EIGEN \ EIGEN_USING_MATRIX_TYPEDEFS \ -using Eigen::Matrix; +using Eigen::Matrix; \ +using Eigen::MatrixBase; #ifdef EIGEN_INTERNAL_DEBUGGING -#define EIGEN_ASSERT_LEVEL 2 +#define eigen_internal_assert(x) assert(x); #else -#define EIGEN_ASSERT_LEVEL 1 +#define eigen_internal_assert(x) #endif -#define eigen_assert(assertLevel, x) if(assertLevel <= EIGEN_ASSERT_LEVEL) assert(x); - #ifdef NDEBUG #define EIGEN_ONLY_USED_FOR_DEBUG(x) (void)x #else @@ -121,12 +120,6 @@ struct ForwardDecl<Matrix<_Scalar, _Rows, _Cols> > const int Dynamic = -1; -enum AssertLevel -{ - UserDebugging = 1, - InternalDebugging = 2 -}; - //classes inheriting NoOperatorEquals don't generate a default operator=. class NoOperatorEquals { diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index 4f0e4c200..36e19f6d0 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -35,7 +35,9 @@ DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 -ALIASES = +ALIASES = \ +"only_for_vectors=This is only for vectors (either row-vectors or column-vectors), \ +as determined by \link MatrixBase::IsVector \endlink." OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO @@ -51,8 +53,8 @@ EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = NO EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO -HIDE_UNDOC_MEMBERS = YES -HIDE_UNDOC_CLASSES = YES +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = YES HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO @@ -61,7 +63,7 @@ HIDE_SCOPE_NAMES = YES SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO +SORT_BRIEF_DOCS = YES SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES @@ -77,7 +79,7 @@ FILE_VERSION_FILTER = #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES +WARN_IF_UNDOCUMENTED = NO WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" @@ -254,21 +256,21 @@ PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -MSCGEN_PATH = -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = YES -CLASS_GRAPH = YES +CLASS_DIAGRAMS = NO +MSCGEN_PATH = NO +HIDE_UNDOC_RELATIONS = NO +HAVE_DOT = NO +CLASS_GRAPH = NO COLLABORATION_GRAPH = NO -GROUP_GRAPHS = YES +GROUP_GRAPHS = NO UML_LOOK = NO TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO CALL_GRAPH = NO CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES +GRAPHICAL_HIERARCHY = NO +DIRECTORY_GRAPH = NO DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = @@ -276,8 +278,8 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES +GENERATE_LEGEND = NO +DOT_CLEANUP = NO #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- diff --git a/doc/benchmark.cpp b/doc/benchmark.cpp index 2bf445ed5..bf476acda 100644 --- a/doc/benchmark.cpp +++ b/doc/benchmark.cpp @@ -3,7 +3,7 @@ #include <Eigen/Core.h> using namespace std; -USING_EIGEN_DATA_TYPES +USING_PART_OF_NAMESPACE_EIGEN int main(int argc, char *argv[]) { diff --git a/doc/example.cpp b/doc/example.cpp index 8b2608655..66c51b2c3 100644 --- a/doc/example.cpp +++ b/doc/example.cpp @@ -1,18 +1,18 @@ #include <Eigen/Core.h> -USING_EIGEN_DATA_TYPES +USING_PART_OF_NAMESPACE_EIGEN using namespace std; template<typename Scalar, typename Derived> -void foo(const Eigen::MatrixBase<Scalar, Derived>& m) +void foo(const MatrixBase<Scalar, Derived>& m) { cout << "Here's m:" << endl << m << endl; } template<typename Scalar, typename Derived> Eigen::ScalarMultiple<Derived> -twice(const Eigen::MatrixBase<Scalar, Derived>& m) +twice(const MatrixBase<Scalar, Derived>& m) { return 2 * m; } diff --git a/doc/examples/class_Block.cpp b/doc/examples/class_Block.cpp new file mode 100644 index 000000000..17dc4bce1 --- /dev/null +++ b/doc/examples/class_Block.cpp @@ -0,0 +1,23 @@ +#include <Eigen/Core.h> +USING_PART_OF_NAMESPACE_EIGEN +using namespace std; + +template<typename Scalar, typename Derived> +Eigen::Block<Derived, 2, 2> +topLeft2x2Corner(MatrixBase<Scalar, Derived>& m) +{ + return Eigen::Block<Derived, 2, 2>(m.ref(), 0, 0); + // note: tempting as it is, writing "m.block<2,2>(0,0)" here + // causes a compile error with g++ 4.2, apparently due to + // g++ getting confused by the many template types and + // template arguments involved. +} + +int main(int, char**) +{ + Matrix3d m = Matrix3d::identity(); + cout << topLeft2x2Corner(m) << endl; + topLeft2x2Corner(m) *= 2; + cout << "Now the matrix m is:" << endl << m << endl; + return 0; +} diff --git a/doc/examples/class_Cast.cpp b/doc/examples/class_Cast.cpp new file mode 100644 index 000000000..d1dfdc8be --- /dev/null +++ b/doc/examples/class_Cast.cpp @@ -0,0 +1,23 @@ +#include <Eigen/Core.h> +USING_PART_OF_NAMESPACE_EIGEN +using namespace std; + +template<typename Scalar, typename Derived> +Eigen::Cast<double, Derived> +castToDouble(const MatrixBase<Scalar, Derived>& m) +{ + return Eigen::Cast<double, Derived>(m.ref()); + // note: tempting as it is, writing "m.cast<double>()" here + // causes a compile error with g++ 4.2, apparently due to + // g++ getting confused by the many template types and + // template arguments involved. +} + +int main(int, char**) +{ + Matrix2i m = Matrix2i::random(); + cout << "Here's the matrix m. It has coefficients of type int." + << endl << m << endl; + cout << "Here's 0.05*m:" << endl << 0.05 * castToDouble(m) << endl; + return 0; +} diff --git a/doc/examples/class_Column.cpp b/doc/examples/class_Column.cpp new file mode 100644 index 000000000..ec8628ab7 --- /dev/null +++ b/doc/examples/class_Column.cpp @@ -0,0 +1,19 @@ +#include <Eigen/Core.h> +USING_PART_OF_NAMESPACE_EIGEN +using namespace std; + +template<typename Scalar, typename Derived> +Eigen::Column<Derived> +firstColumn(MatrixBase<Scalar, Derived>& m) +{ + return m.col(0); +} + +int main(int, char**) +{ + Matrix4d m = Matrix4d::identity(); + cout << firstColumn(m) << endl; + firstColumn(m) *= 5; + cout << "Now the matrix m is:" << endl << m << endl; + return 0; +} diff --git a/doc/examples/class_DynBlock.cpp b/doc/examples/class_DynBlock.cpp index 8407d8733..3a8b607da 100644 --- a/doc/examples/class_DynBlock.cpp +++ b/doc/examples/class_DynBlock.cpp @@ -1,10 +1,10 @@ #include <Eigen/Core.h> -USING_EIGEN_DATA_TYPES +USING_PART_OF_NAMESPACE_EIGEN using namespace std; template<typename Scalar, typename Derived> Eigen::DynBlock<Derived> -topLeftCorner(const Eigen::MatrixBase<Scalar, Derived>& m, int rows, int cols) +topLeftCorner(MatrixBase<Scalar, Derived>& m, int rows, int cols) { return m.dynBlock(0, 0, rows, cols); } diff --git a/doc/examples/class_Row.cpp b/doc/examples/class_Row.cpp new file mode 100644 index 000000000..70a388015 --- /dev/null +++ b/doc/examples/class_Row.cpp @@ -0,0 +1,19 @@ +#include <Eigen/Core.h> +USING_PART_OF_NAMESPACE_EIGEN +using namespace std; + +template<typename Scalar, typename Derived> +Eigen::Row<Derived> +firstRow(MatrixBase<Scalar, Derived>& m) +{ + return m.row(0); +} + +int main(int, char**) +{ + Matrix4d m = Matrix4d::identity(); + cout << firstRow(m) << endl; + firstRow(m) *= 5; + cout << "Now the matrix m is:" << endl << m << endl; + return 0; +} diff --git a/doc/snippets/MatrixBase_block.cpp b/doc/snippets/MatrixBase_block.cpp new file mode 100644 index 000000000..0a1b6d6d3 --- /dev/null +++ b/doc/snippets/MatrixBase_block.cpp @@ -0,0 +1,3 @@ +Matrix4d m = Matrix4d::diagonal(Vector4d(1,2,3,4)); +m.block<2, 2>(2, 0) = m.block<2, 2>(2, 2); +cout << m << endl; diff --git a/doc/snippets/MatrixBase_cast.cpp b/doc/snippets/MatrixBase_cast.cpp new file mode 100644 index 000000000..f59b97df6 --- /dev/null +++ b/doc/snippets/MatrixBase_cast.cpp @@ -0,0 +1,3 @@ +Matrix2d md = Matrix2d::identity() * 0.45; +Matrix2f mf = Matrix2f::identity(); +cout << md + mf.cast<double>() << endl; diff --git a/doc/snippets/MatrixBase_col.cpp b/doc/snippets/MatrixBase_col.cpp new file mode 100644 index 000000000..ae287db32 --- /dev/null +++ b/doc/snippets/MatrixBase_col.cpp @@ -0,0 +1,3 @@ +Matrix3d m = Matrix3d::identity(); +m.col(1) = Vector3d(4,5,6); +cout << m << endl; diff --git a/doc/snippets/MatrixBase_dynBlock.cpp b/doc/snippets/MatrixBase_dynBlock.cpp index 5ca7655ed..4fc6aceb3 100644 --- a/doc/snippets/MatrixBase_dynBlock.cpp +++ b/doc/snippets/MatrixBase_dynBlock.cpp @@ -1,3 +1,3 @@ -Matrix4d m = Matrix4d::identity(); -m.dynBlock(2,0,2,2) = m.dynBlock(0,0,2,2); +Matrix3d m = Matrix3d::diagonal(Vector3d(1,2,3)); +m.dynBlock(1, 0, 2, 1) = m.dynBlock(1, 1, 2, 1); cout << m << endl; diff --git a/doc/snippets/MatrixBase_row.cpp b/doc/snippets/MatrixBase_row.cpp new file mode 100644 index 000000000..3f1d73b9e --- /dev/null +++ b/doc/snippets/MatrixBase_row.cpp @@ -0,0 +1,3 @@ +Matrix3d m = Matrix3d::identity(); +m.row(1) = Vector3d(4,5,6); +cout << m << endl; diff --git a/doc/snippets/compile_snippet.cpp.in b/doc/snippets/compile_snippet.cpp.in index 952a3ee81..9f7d568e5 100644 --- a/doc/snippets/compile_snippet.cpp.in +++ b/doc/snippets/compile_snippet.cpp.in @@ -1,5 +1,5 @@ #include <Eigen/Core.h> -USING_EIGEN_DATA_TYPES +USING_PART_OF_NAMESPACE_EIGEN using namespace std; int main(int, char**) { diff --git a/doc/tutorial.cpp b/doc/tutorial.cpp index e98e1c07a..63ed3e5a5 100644 --- a/doc/tutorial.cpp +++ b/doc/tutorial.cpp @@ -1,6 +1,6 @@ #include <Eigen/Core.h> -USING_EIGEN_DATA_TYPES +USING_PART_OF_NAMESPACE_EIGEN using namespace std; |