From 7aba51ce530e95e062c098ab4fdbfa2de2c5d8da Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Wed, 20 Aug 2008 00:58:25 +0000 Subject: * Added .all() and .any() members to PartialRedux * Bug fixes in euler angle snippet, Assign and MapBase * Started a "quick start guide" (draft state) --- Eigen/src/Array/PartialRedux.h | 20 +++++- Eigen/src/Core/Assign.h | 2 +- Eigen/src/Core/CommaInitializer.h | 10 +-- Eigen/src/Core/MapBase.h | 2 +- doc/QuickStartGuide.dox | 117 +++++++++++++++++++++++++++++++++ doc/snippets/AngleAxis_mimic_euler.cpp | 7 +- doc/snippets/Tutorial_commainit_01.cpp | 5 ++ doc/snippets/Tutorial_commainit_02.cpp | 7 ++ 8 files changed, 158 insertions(+), 12 deletions(-) create mode 100644 doc/QuickStartGuide.dox create mode 100644 doc/snippets/Tutorial_commainit_01.cpp create mode 100644 doc/snippets/Tutorial_commainit_02.cpp diff --git a/Eigen/src/Array/PartialRedux.h b/Eigen/src/Array/PartialRedux.h index bdd657368..e34766aa8 100644 --- a/Eigen/src/Array/PartialRedux.h +++ b/Eigen/src/Array/PartialRedux.h @@ -114,6 +114,8 @@ EIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits::MulCost + (Size-1)*NumT EIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits::AddCost); EIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits::AddCost); EIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits::AddCost); +EIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits::AddCost); +EIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits::AddCost); /** \internal */ template @@ -216,7 +218,7 @@ template class PartialRedux * * Example: \include PartialRedux_norm.cpp * Output: \verbinclude PartialRedux_norm.out - * + * * \sa MatrixBase::norm() */ const typename ReturnType::Type norm() const { return _expression(); } @@ -226,11 +228,25 @@ template class PartialRedux * * Example: \include PartialRedux_sum.cpp * Output: \verbinclude PartialRedux_sum.out - * + * * \sa MatrixBase::sum() */ const typename ReturnType::Type sum() const { return _expression(); } + /** \returns a row (or column) vector expression representing + * whether \b all coefficients of each respective column (or row) are \c true. + * + * \sa MatrixBase::all() */ + const typename ReturnType::Type all() const + { return _expression(); } + + /** \returns a row (or column) vector expression representing + * whether \b at \b least one coefficient of each respective column (or row) is \c true. + * + * \sa MatrixBase::any() */ + const typename ReturnType::Type any() const + { return _expression(); } + protected: ExpressionTypeNested m_matrix; }; diff --git a/Eigen/src/Core/Assign.h b/Eigen/src/Core/Assign.h index 0145fc7b3..758858165 100644 --- a/Eigen/src/Core/Assign.h +++ b/Eigen/src/Core/Assign.h @@ -385,7 +385,7 @@ struct ei_assign_impl dst.copyCoeff(index, i, src); } - alignedStart = (alignedStart+alignedStep)%packetSize; + alignedStart = std::min((alignedStart+alignedStep)%packetSize, innerSize); } } }; diff --git a/Eigen/src/Core/CommaInitializer.h b/Eigen/src/Core/CommaInitializer.h index 137413a7c..c394c3d78 100644 --- a/Eigen/src/Core/CommaInitializer.h +++ b/Eigen/src/Core/CommaInitializer.h @@ -53,10 +53,10 @@ struct MatrixBase::CommaInitializer m_col = 0; m_currentBlockRows = 1; ei_assert(m_row::CommaInitializer m_col = 0; m_currentBlockRows = other.rows(); ei_assert(m_row+m_currentBlockRows<=m_matrix.rows() - && "Too many rows passed to MatrixBase::operator<<"); + && "Too many rows passed to comma initializer (operator<<)"); } ei_assert(m_col::CommaInitializer { ei_assert((m_row+m_currentBlockRows) == m_matrix.rows() && m_col == m_matrix.cols() - && "Too few coefficients passed to Matrix::operator<<"); + && "Too few coefficients passed to comma initializer (operator<<)"); } /** \returns the built matrix once all its coefficients have been set. diff --git a/Eigen/src/Core/MapBase.h b/Eigen/src/Core/MapBase.h index 74b7d76aa..4f61d1529 100644 --- a/Eigen/src/Core/MapBase.h +++ b/Eigen/src/Core/MapBase.h @@ -47,7 +47,7 @@ template class MapBase typedef MatrixBase Base; enum { - IsRowMajor = int(ei_traits::Flags) & RowMajorBit ? 1 : 0, + IsRowMajor = (int(ei_traits::Flags) & RowMajorBit) ? 1 : 0, PacketAccess = ei_traits::PacketAccess, RowsAtCompileTime = ei_traits::RowsAtCompileTime, ColsAtCompileTime = ei_traits::ColsAtCompileTime, diff --git a/doc/QuickStartGuide.dox b/doc/QuickStartGuide.dox new file mode 100644 index 000000000..8c75bebac --- /dev/null +++ b/doc/QuickStartGuide.dox @@ -0,0 +1,117 @@ +namespace Eigen { + +/** \page QuickStartGuide + +

Quick start guide

+ +

Matrix creation and initialization

+ +In Eigen all kind of dense matrices and vectors are represented by the template class Matrix, e.g.: +\code Matrix m(size,4);\endcode +declares a matrix of 4 columns and having a dynamic (runtime) number of rows. +However, in most cases you can simply use one of the several convenient typedefs (\ref matrixtypedefs), e.g.: +\code Matrix3f m = Matrix3f::Identity(); \endcode +creates a 3x3 fixed size float matrix intialized to the identity matrix, while: +\code MatrixXcd m = MatrixXcd::Zero(rows,cols); \endcode +creates a rows x cols matrix of double precision complex initialized to zero where rows and cols do not have to be +known at runtime. In MatrixXcd "X" stands for dynamic, "c" for complex, and "d" for double. + +You can also initialize a matrix with all coefficients equal to one: +\code MatrixXi m = MatrixXi::Ones(rows,cols); \endcode +or to any constant value, e.g.: +\code +MatrixXi m = MatrixXi::Constant(rows,cols,66); +Matrix4d m = Matrix4d::Constant(6.6); +\endcode + +All these 4 matrix creation functions also exist with the "set" prefix: +\code +Matrix3f m3; MatrixXi mx; VectorXcf vec; +m3.setZero(); mx.setZero(rows,cols); vec.setZero(size); +m3.setIdentity(); mx.setIdentity(rows,cols); vec.setIdentity(size); +m3.setOnes(); mx.setOnes(rows,cols); vec.setOnes(size); +m3.setConstant(6.6); mx.setConstant(rows,cols,6.6); vec.setConstant(size,complex(6,3)); +\endcode + +Finally, all the coefficient of a matrix can set using the comma initializer: + +
+\include Tutorial_commainit_01.cpp + +output: +\verbinclude Tutorial_commainit_01.out +
+ +Eigen's comma initializer also allows to set the matrix per block making it much more powerful: + +
+\include Tutorial_commainit_02.cpp + +output with rows=cols=5: +\verbinclude Tutorial_commainit_02.out +
+ +

Basic Linear Algebra

+ +As long as you use mathematically well defined operators, you can basically write your matrix and vector expressions as you would do with a pen an a piece of paper: +\code +mat1 = mat1*1.5 + mat2 * mat3/4; +\endcode + +\b dot \b product (inner product): +\code +scalar = vec1.dot(vec2); +\endcode + +\b outer \b product: +\code +mat = vec1 * vec2.transpose(); +\endcode + +\b cross \b product: The cross product is defined in the Geometry module, you therefore have to include it first: +\code +#include +vec3 = vec1.cross(vec2); +\endcode + + +By default, Eigen's only allows mathematically well defined operators. However, Eigen's matrices can also be used as simple numerical containers while still offering most common coefficient wise operations via the .cwise() operator prefix: +* Coefficient wise product: \code mat3 = mat1.cwise() * mat2; \endcode +* Coefficient wise division: \code mat3 = mat1.cwise() / mat2; \endcode +* Coefficient wise reciprocal: \code mat3 = mat1.cwise().inverse(); \endcode +* Add a scalar to a matrix: \code mat3 = mat1.cwise() + scalar; \endcode +* Coefficient wise comparison: \code mat3 = mat1.cwise() < mat2; \endcode +* Finally, \c .cwise() offers many common numerical functions including abs, pow, exp, sin, cos, tan, e.g.: +\code mat3 = mat1.cwise().sin(); \endcode + +

Reductions

+ +\code +scalar = mat.sum(); scalar = mat.norm(); scalar = mat.minCoeff(); +vec = mat.colwise().sum(); vec = mat.colwise().norm(); vec = mat.colwise().minCoeff(); +vec = mat.rowwise().sum(); vec = mat.rowwise().norm(); vec = mat.rowwise().minCoeff(); +\endcode +Other natively supported reduction operations include maxCoeff(), norm2(), all() and any(). + + +

Sub matrices

+ + + +

Geometry features

+ + +

Notes on performances

+ + +

Advanced Linear Algebra

+ +

Solving linear problems

+

LU

+

Cholesky

+

QR

+

Eigen value problems

+ +*/ + +} diff --git a/doc/snippets/AngleAxis_mimic_euler.cpp b/doc/snippets/AngleAxis_mimic_euler.cpp index 46ec41aa5..456de7f7e 100644 --- a/doc/snippets/AngleAxis_mimic_euler.cpp +++ b/doc/snippets/AngleAxis_mimic_euler.cpp @@ -1,4 +1,5 @@ -Matrix3f m = AngleAxisf(0.25*M_PI, Vector3f::UnitX()) - * AngleAxisf(0.5*M_PI, Vector3f::UnitY()) - * AngleAxisf(0.33*M_PI, Vector3f::UnitZ()); +Matrix3f m; +m = AngleAxisf(0.25*M_PI, Vector3f::UnitX()) + * AngleAxisf(0.5*M_PI, Vector3f::UnitY()) + * AngleAxisf(0.33*M_PI, Vector3f::UnitZ()); cout << m << endl << "is unitary: " << m.isUnitary() << endl; diff --git a/doc/snippets/Tutorial_commainit_01.cpp b/doc/snippets/Tutorial_commainit_01.cpp new file mode 100644 index 000000000..f0a51509a --- /dev/null +++ b/doc/snippets/Tutorial_commainit_01.cpp @@ -0,0 +1,5 @@ +Matrix3f m; +m << 1, 2, 3, + 4, 5, 6, + 7, 8, 9; +cout << m; \ No newline at end of file diff --git a/doc/snippets/Tutorial_commainit_02.cpp b/doc/snippets/Tutorial_commainit_02.cpp new file mode 100644 index 000000000..6ffea9105 --- /dev/null +++ b/doc/snippets/Tutorial_commainit_02.cpp @@ -0,0 +1,7 @@ +int rows=5, cols=5; +MatrixXf m(rows,cols); +m << (Matrix3f() << 1, 2, 3, 4, 5, 6, 7, 8, 9).finished(), + MatrixXf::Zero(3,cols-3), + MatrixXf::Zero(rows-3,3), + MatrixXf::Identity(rows-3,cols-3); +cout << m; \ No newline at end of file -- cgit v1.2.3