diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-06-08 15:39:09 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-06-08 15:39:09 +0200 |
commit | cbe3a1a83e811773687c0efaac080e388611252b (patch) | |
tree | 4c39ff32e768262adb0b38f871c8a8c8cb1aef63 /Eigen | |
parent | a7ae628c9f8a83973e899866ecd344bbfde6e844 (diff) |
Add missing accessors for 1D index based access to Replicate<> expressions.
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/CoreEvaluators.h | 20 | ||||
-rw-r--r-- | Eigen/src/Core/Replicate.h | 25 |
2 files changed, 20 insertions, 25 deletions
diff --git a/Eigen/src/Core/CoreEvaluators.h b/Eigen/src/Core/CoreEvaluators.h index ce00566a5..850877079 100644 --- a/Eigen/src/Core/CoreEvaluators.h +++ b/Eigen/src/Core/CoreEvaluators.h @@ -934,6 +934,16 @@ struct unary_evaluator<Replicate<ArgType, RowFactor, ColFactor> > 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> PacketReturnType packet(Index row, Index col) const @@ -947,6 +957,16 @@ struct unary_evaluator<Replicate<ArgType, RowFactor, ColFactor> > 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: const ArgTypeNested m_arg; // FIXME is it OK to store both the argument and its evaluator?? (we have the same situation in evaluator_product) diff --git a/Eigen/src/Core/Replicate.h b/Eigen/src/Core/Replicate.h index 3777049ee..b976cbd54 100644 --- a/Eigen/src/Core/Replicate.h +++ b/Eigen/src/Core/Replicate.h @@ -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 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 { return m_matrix; |