aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2008-08-20 00:58:25 +0000
committerGravatar Gael Guennebaud <g.gael@free.fr>2008-08-20 00:58:25 +0000
commit7aba51ce530e95e062c098ab4fdbfa2de2c5d8da (patch)
tree7b76d457da52b928a7cfe1f60673145ee128742a
parentc6674ab0767ce121b00389559847457e80728780 (diff)
* Added .all() and .any() members to PartialRedux
* Bug fixes in euler angle snippet, Assign and MapBase * Started a "quick start guide" (draft state)
-rw-r--r--Eigen/src/Array/PartialRedux.h20
-rw-r--r--Eigen/src/Core/Assign.h2
-rw-r--r--Eigen/src/Core/CommaInitializer.h10
-rw-r--r--Eigen/src/Core/MapBase.h2
-rw-r--r--doc/QuickStartGuide.dox117
-rw-r--r--doc/snippets/AngleAxis_mimic_euler.cpp7
-rw-r--r--doc/snippets/Tutorial_commainit_01.cpp5
-rw-r--r--doc/snippets/Tutorial_commainit_02.cpp7
8 files changed, 158 insertions, 12 deletions
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<Scalar>::MulCost + (Size-1)*NumT
EIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost);
EIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
EIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost);
/** \internal */
template <typename BinaryOp, typename Scalar>
@@ -216,7 +218,7 @@ template<typename ExpressionType, int Direction> class PartialRedux
*
* Example: \include PartialRedux_norm.cpp
* Output: \verbinclude PartialRedux_norm.out
- *
+ *
* \sa MatrixBase::norm() */
const typename ReturnType<ei_member_norm>::Type norm() const
{ return _expression(); }
@@ -226,11 +228,25 @@ template<typename ExpressionType, int Direction> class PartialRedux
*
* Example: \include PartialRedux_sum.cpp
* Output: \verbinclude PartialRedux_sum.out
- *
+ *
* \sa MatrixBase::sum() */
const typename ReturnType<ei_member_sum>::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<ei_member_all>::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<ei_member_any>::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<Derived1, Derived2, SliceVectorization, NoUnrolling>
dst.copyCoeff(index, i, src);
}
- alignedStart = (alignedStart+alignedStep)%packetSize;
+ alignedStart = std::min<int>((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<Derived>::CommaInitializer
m_col = 0;
m_currentBlockRows = 1;
ei_assert(m_row<m_matrix.rows()
- && "Too many rows passed to MatrixBase::operator<<");
+ && "Too many rows passed to comma initializer (operator<<)");
}
ei_assert(m_col<m_matrix.cols()
- && "Too many coefficients passed to MatrixBase::operator<<");
+ && "Too many coefficients passed to comma initializer (operator<<)");
ei_assert(m_currentBlockRows==1);
m_matrix.coeffRef(m_row, m_col++) = s;
return *this;
@@ -71,10 +71,10 @@ struct MatrixBase<Derived>::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<m_matrix.cols()
- && "Too many coefficients passed to MatrixBase::operator<<");
+ && "Too many coefficients passed to comma initializer (operator<<)");
ei_assert(m_currentBlockRows==other.rows());
if (OtherDerived::SizeAtCompileTime != Dynamic)
m_matrix.block<OtherDerived::RowsAtCompileTime != Dynamic ? OtherDerived::RowsAtCompileTime : 1,
@@ -90,7 +90,7 @@ struct MatrixBase<Derived>::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<typename Derived> class MapBase
typedef MatrixBase<Derived> Base;
enum {
- IsRowMajor = int(ei_traits<Derived>::Flags) & RowMajorBit ? 1 : 0,
+ IsRowMajor = (int(ei_traits<Derived>::Flags) & RowMajorBit) ? 1 : 0,
PacketAccess = ei_traits<Derived>::PacketAccess,
RowsAtCompileTime = ei_traits<Derived>::RowsAtCompileTime,
ColsAtCompileTime = ei_traits<Derived>::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
+
+<h1>Quick start guide</h1>
+
+<h2>Matrix creation and initialization</h2>
+
+In Eigen all kind of dense matrices and vectors are represented by the template class Matrix, e.g.:
+\code Matrix<int,Dynamic,4> 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<float>(6,3));
+\endcode
+
+Finally, all the coefficient of a matrix can set using the comma initializer:
+<table><tr><td>
+\include Tutorial_commainit_01.cpp
+</td>
+<td>
+output:
+\verbinclude Tutorial_commainit_01.out
+</td></tr></table>
+
+Eigen's comma initializer also allows to set the matrix per block making it much more powerful:
+<table><tr><td>
+\include Tutorial_commainit_02.cpp
+</td>
+<td>
+output with rows=cols=5:
+\verbinclude Tutorial_commainit_02.out
+</td></tr></table>
+
+<h2>Basic Linear Algebra</h2>
+
+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 <Eigen/Geometry>
+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
+
+<h2>Reductions</h2>
+
+\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().
+
+
+<h2>Sub matrices</h2>
+
+
+
+<h2>Geometry features</h2>
+
+
+<h2>Notes on performances</h2>
+
+
+<h2>Advanced Linear Algebra</h2>
+
+<h3>Solving linear problems</h3>
+<h3>LU</h3>
+<h3>Cholesky</h3>
+<h3>QR</h3>
+<h3>Eigen value problems</h3>
+
+*/
+
+}
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