mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-22 01:29:35 +08:00
Add missing accessors for 1D index based access to Replicate<> expressions.
This commit is contained in:
parent
a7ae628c9f
commit
cbe3a1a83e
@ -935,6 +935,16 @@ struct unary_evaluator<Replicate<ArgType, RowFactor, ColFactor> >
|
|||||||
return m_argImpl.coeff(actual_row, actual_col);
|
return m_argImpl.coeff(actual_row, actual_col);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const
|
||||||
|
{
|
||||||
|
// try to avoid using modulo; this is a pure optimization strategy
|
||||||
|
const Index actual_index = internal::traits<XprType>::RowsAtCompileTime==1
|
||||||
|
? (ColFactor==1 ? index : index%m_cols.value())
|
||||||
|
: (RowFactor==1 ? index : index%m_rows.value());
|
||||||
|
|
||||||
|
return m_argImpl.coeff(actual_index);
|
||||||
|
}
|
||||||
|
|
||||||
template<int LoadMode>
|
template<int LoadMode>
|
||||||
PacketReturnType packet(Index row, Index col) const
|
PacketReturnType packet(Index row, Index col) const
|
||||||
{
|
{
|
||||||
@ -948,6 +958,16 @@ struct unary_evaluator<Replicate<ArgType, RowFactor, ColFactor> >
|
|||||||
return m_argImpl.template packet<LoadMode>(actual_row, actual_col);
|
return m_argImpl.template packet<LoadMode>(actual_row, actual_col);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<int LoadMode>
|
||||||
|
PacketReturnType packet(Index index) const
|
||||||
|
{
|
||||||
|
const Index actual_index = internal::traits<XprType>::RowsAtCompileTime==1
|
||||||
|
? (ColFactor==1 ? index : index%m_cols.value())
|
||||||
|
: (RowFactor==1 ? index : index%m_rows.value());
|
||||||
|
|
||||||
|
return m_argImpl.template packet<LoadMode>(actual_index);
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const ArgTypeNested m_arg; // FIXME is it OK to store both the argument and its evaluator?? (we have the same situation in evaluator_product)
|
const ArgTypeNested m_arg; // FIXME is it OK to store both the argument and its evaluator?? (we have the same situation in evaluator_product)
|
||||||
typename evaluator<ArgTypeNestedCleaned>::nestedType m_argImpl;
|
typename evaluator<ArgTypeNestedCleaned>::nestedType m_argImpl;
|
||||||
|
@ -91,31 +91,6 @@ template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
|
|||||||
inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); }
|
inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); }
|
||||||
inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); }
|
inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); }
|
||||||
|
|
||||||
inline Scalar coeff(Index rowId, Index colId) const
|
|
||||||
{
|
|
||||||
// try to avoid using modulo; this is a pure optimization strategy
|
|
||||||
const Index actual_row = internal::traits<MatrixType>::RowsAtCompileTime==1 ? 0
|
|
||||||
: RowFactor==1 ? rowId
|
|
||||||
: rowId%m_matrix.rows();
|
|
||||||
const Index actual_col = internal::traits<MatrixType>::ColsAtCompileTime==1 ? 0
|
|
||||||
: ColFactor==1 ? colId
|
|
||||||
: colId%m_matrix.cols();
|
|
||||||
|
|
||||||
return m_matrix.coeff(actual_row, actual_col);
|
|
||||||
}
|
|
||||||
template<int LoadMode>
|
|
||||||
inline PacketScalar packet(Index rowId, Index colId) const
|
|
||||||
{
|
|
||||||
const Index actual_row = internal::traits<MatrixType>::RowsAtCompileTime==1 ? 0
|
|
||||||
: RowFactor==1 ? rowId
|
|
||||||
: rowId%m_matrix.rows();
|
|
||||||
const Index actual_col = internal::traits<MatrixType>::ColsAtCompileTime==1 ? 0
|
|
||||||
: ColFactor==1 ? colId
|
|
||||||
: colId%m_matrix.cols();
|
|
||||||
|
|
||||||
return m_matrix.template packet<LoadMode>(actual_row, actual_col);
|
|
||||||
}
|
|
||||||
|
|
||||||
const _MatrixTypeNested& nestedExpression() const
|
const _MatrixTypeNested& nestedExpression() const
|
||||||
{
|
{
|
||||||
return m_matrix;
|
return m_matrix;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user