10 #ifndef EIGEN_HOMOGENEOUS_H 11 #define EIGEN_HOMOGENEOUS_H 32 template<
typename MatrixType,
int Direction>
40 RowsPlusOne = (MatrixType::RowsAtCompileTime !=
Dynamic) ?
41 int(MatrixType::RowsAtCompileTime) + 1 :
Dynamic,
42 ColsPlusOne = (MatrixType::ColsAtCompileTime !=
Dynamic) ?
43 int(MatrixType::ColsAtCompileTime) + 1 :
Dynamic,
44 RowsAtCompileTime = Direction==
Vertical ? RowsPlusOne : MatrixType::RowsAtCompileTime,
45 ColsAtCompileTime = Direction==
Horizontal ? ColsPlusOne : MatrixType::ColsAtCompileTime,
46 MaxRowsAtCompileTime = RowsAtCompileTime,
47 MaxColsAtCompileTime = ColsAtCompileTime,
52 CoeffReadCost = _MatrixTypeNested::CoeffReadCost
61 template<
typename MatrixType,
int _Direction>
class Homogeneous 66 enum { Direction = _Direction };
80 if( (
int(Direction)==
Vertical && row==m_matrix.rows())
81 || (
int(Direction)==
Horizontal && col==m_matrix.cols()))
83 return m_matrix.coeff(row, col);
86 template<
typename Rhs>
94 template<
typename Lhs>
friend 102 template<
typename Scalar,
int Dim,
int Mode,
int Options>
friend 125 template<
typename Derived>
141 template<
typename ExpressionType,
int Direction>
145 return _expression();
156 template<
typename Derived>
162 ColsAtCompileTime==1?size()-1:1,
163 ColsAtCompileTime==1?1:size()-1) / coeff(size()-1);
174 template<
typename ExpressionType,
int Direction>
179 Direction==
Vertical ? _expression().rows()-1 : _expression().rows(),
180 Direction==
Horizontal ? _expression().cols()-1 : _expression().cols()).cwiseQuotient(
182 Direction==
Vertical ? HNormalized_SizeMinusOne : 1,
183 Direction==
Horizontal ? HNormalized_SizeMinusOne : 1>
185 Direction==
Vertical ? _expression().rows()-1:0,
186 Direction==
Horizontal ? _expression().cols()-1:0,
187 Direction==
Vertical ? 1 : _expression().rows(),
188 Direction==
Horizontal ? 1 : _expression().cols()),
189 Direction==
Vertical ? _expression().rows()-1 : 1,
190 Direction==
Horizontal ? _expression().cols()-1 : 1));
195 template<
typename MatrixOrTransformType>
198 typedef MatrixOrTransformType
type;
199 static const type&
run(
const type &x) {
return x; }
202 template<
typename Scalar,
int Dim,
int Mode,
int Options>
207 static type
run (
const TransformType& x) {
return x.
affine(); }
210 template<
typename Scalar,
int Dim,
int Options>
215 static const type&
run (
const TransformType& x) {
return x.
matrix(); }
218 template<
typename MatrixType,
typename Lhs>
226 LhsMatrixTypeCleaned::RowsAtCompileTime,
227 MatrixTypeCleaned::ColsAtCompileTime,
228 MatrixTypeCleaned::PlainObject::Options,
229 LhsMatrixTypeCleaned::MaxRowsAtCompileTime,
233 template<
typename MatrixType,
typename Lhs>
235 :
public ReturnByValue<homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> >
240 typedef typename MatrixType::Index
Index;
246 inline Index
rows()
const {
return m_lhs.rows(); }
247 inline Index
cols()
const {
return m_rhs.cols(); }
249 template<
typename Dest>
void evalTo(Dest& dst)
const 252 dst =
Block<
const LhsMatrixTypeNested,
253 LhsMatrixTypeNested::RowsAtCompileTime,
254 LhsMatrixTypeNested::ColsAtCompileTime==
Dynamic?
Dynamic:LhsMatrixTypeNested::ColsAtCompileTime-1>
255 (m_lhs,0,0,m_lhs.rows(),m_lhs.cols()-1) * m_rhs;
256 dst += m_lhs.col(m_lhs.cols()-1).rowwise()
257 .template replicate<MatrixType::ColsAtCompileTime>(m_rhs.cols());
260 typename LhsMatrixTypeCleaned::Nested
m_lhs;
264 template<
typename MatrixType,
typename Rhs>
268 MatrixType::RowsAtCompileTime,
269 Rhs::ColsAtCompileTime,
270 MatrixType::PlainObject::Options,
271 MatrixType::MaxRowsAtCompileTime,
275 template<
typename MatrixType,
typename Rhs>
277 :
public ReturnByValue<homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> >
280 typedef typename MatrixType::Index
Index;
282 : m_lhs(lhs), m_rhs(rhs)
285 inline Index
rows()
const {
return m_lhs.rows(); }
286 inline Index
cols()
const {
return m_rhs.cols(); }
288 template<
typename Dest>
void evalTo(Dest& dst)
const 291 dst = m_lhs *
Block<
const RhsNested,
292 RhsNested::RowsAtCompileTime==
Dynamic?
Dynamic:RhsNested::RowsAtCompileTime-1,
293 RhsNested::ColsAtCompileTime>
294 (m_rhs,0,0,m_rhs.rows()-1,m_rhs.cols());
295 dst += m_rhs.row(m_rhs.rows()-1).colwise()
296 .template replicate<MatrixType::RowsAtCompileTime>(m_lhs.rows());
307 #endif // EIGEN_HOMOGENEOUS_H
MatrixOrTransformType type
internal::traits< Derived >::Scalar Scalar
remove_all< LhsMatrixType >::type LhsMatrixTypeCleaned
take_matrix_for_product< Lhs >::type LhsMatrixType
Scalar coeff(Index row, Index col) const
remove_all< typename Rhs::Nested >::type RhsNested
internal::traits< Derived >::Index Index
The type of indices.
void evalTo(Dest &dst) const
homogeneous_right_product_impl(const MatrixType &lhs, const Rhs &rhs)
Expression of the transpose of a matrix.
nested< MatrixType >::type MatrixTypeNested
remove_reference< MatrixTypeNested >::type _MatrixTypeNested
iterative scaling algorithm to equilibrate rows and column norms in matrices
remove_all< MatrixType >::type MatrixTypeCleaned
const internal::permut_matrix_product_retval< PermutationDerived, Derived, OnTheRight > operator*(const MatrixBase< Derived > &matrix, const PermutationBase< PermutationDerived > &permutation)
Pseudo expression providing partial reduction operations.
homogeneous_left_product_impl(const Lhs &lhs, const MatrixType &rhs)
const unsigned int RowMajorBit
const HNormalizedReturnType hnormalized() const
void evalTo(Dest &dst) const
LhsMatrixTypeCleaned::Nested m_lhs
Generic expression where a coefficient-wise binary operator is applied to two expressions.
const unsigned int HereditaryBits
make_proper_matrix_type< typename traits< MatrixType >::Scalar, MatrixType::RowsAtCompileTime, Rhs::ColsAtCompileTime, MatrixType::PlainObject::Options, MatrixType::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime >::type ReturnType
remove_all< typename LhsMatrixTypeCleaned::Nested >::type LhsMatrixTypeNested
Expression of the multiple replication of a matrix or vector.
Provides a generic way to set and pass user-specified options.
const HNormalizedReturnType hnormalized() const
remove_all< LhsMatrixType >::type LhsMatrixTypeCleaned
static const type & run(const type &x)
traits< homogeneous_left_product_impl >::LhsMatrixType LhsMatrixType
void rhs(const real_t *x, real_t *f)
make_proper_matrix_type< typename traits< MatrixTypeCleaned >::Scalar, LhsMatrixTypeCleaned::RowsAtCompileTime, MatrixTypeCleaned::ColsAtCompileTime, MatrixTypeCleaned::PlainObject::Options, LhsMatrixTypeCleaned::MaxRowsAtCompileTime, MatrixTypeCleaned::MaxColsAtCompileTime >::type ReturnType
#define EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
Expression of a fixed-size or dynamic-size block.
Generic expression where a coefficient-wise unary operator is applied to an expression.
MatrixBase< Homogeneous > Base
traits< MatrixType >::StorageKind StorageKind
MatrixType::Nested m_matrix
#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE)
Base class for all dense matrices, vectors, and expressions.
Expression of one (or a set of) homogeneous vector(s)