mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-22 09:39:34 +08:00
* Added .all() and .any() members to PartialRedux
* Bug fixes in euler angle snippet, Assign and MapBase * Started a "quick start guide" (draft state)
This commit is contained in:
parent
c6674ab076
commit
7aba51ce53
@ -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>
|
||||
@ -231,6 +233,20 @@ template<typename ExpressionType, int Direction> class PartialRedux
|
||||
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;
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -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.
|
||||
|
@ -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,
|
||||
|
117
doc/QuickStartGuide.dox
Normal file
117
doc/QuickStartGuide.dox
Normal file
@ -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>
|
||||
|
||||
*/
|
||||
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
Matrix3f m = AngleAxisf(0.25*M_PI, Vector3f::UnitX())
|
||||
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;
|
||||
|
5
doc/snippets/Tutorial_commainit_01.cpp
Normal file
5
doc/snippets/Tutorial_commainit_01.cpp
Normal file
@ -0,0 +1,5 @@
|
||||
Matrix3f m;
|
||||
m << 1, 2, 3,
|
||||
4, 5, 6,
|
||||
7, 8, 9;
|
||||
cout << m;
|
7
doc/snippets/Tutorial_commainit_02.cpp
Normal file
7
doc/snippets/Tutorial_commainit_02.cpp
Normal file
@ -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;
|
Loading…
x
Reference in New Issue
Block a user