fix and extend replicate optimization, and add the packet method though it is currently disabled

This commit is contained in:
Gael Guennebaud 2010-03-15 10:39:00 +01:00
parent d68b85744f
commit d536fef1bb

View File

@ -76,7 +76,7 @@ template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE) THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
ei_assert(RowFactor!=Dynamic && ColFactor!=Dynamic); ei_assert(RowFactor!=Dynamic && ColFactor!=Dynamic);
} }
template<typename OriginalMatrixType> template<typename OriginalMatrixType>
inline Replicate(const OriginalMatrixType& matrix, int rowFactor, int colFactor) inline Replicate(const OriginalMatrixType& matrix, int rowFactor, int colFactor)
: m_matrix(matrix), m_rowFactor(rowFactor), m_colFactor(colFactor) : m_matrix(matrix), m_rowFactor(rowFactor), m_colFactor(colFactor)
@ -91,14 +91,28 @@ template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
inline Scalar coeff(int row, int col) const inline Scalar coeff(int row, int col) const
{ {
// try to avoid using modulo; this is a pure optimization strategy // try to avoid using modulo; this is a pure optimization strategy
// - it is assumed unlikely that RowFactor==1 && ColFactor==1 const int actual_row = ei_traits<MatrixType>::RowsAtCompileTime==1 ? 0
if (RowFactor==1) : RowFactor==1 ? row
return m_matrix.coeff(m_matrix.rows(), col%m_matrix.cols()); : row%m_matrix.rows();
else if (ColFactor==1) const int actual_col = ei_traits<MatrixType>::ColsAtCompileTime==1 ? 0
return m_matrix.coeff(row%m_matrix.rows(), m_matrix.cols()); : ColFactor==1 ? col
else : col%m_matrix.cols();
return m_matrix.coeff(row%m_matrix.rows(), col%m_matrix.cols());
return m_matrix.coeff(actual_row, actual_col);
} }
template<int LoadMode>
inline PacketScalar packet(int row, int col) const
{
const int actual_row = ei_traits<MatrixType>::RowsAtCompileTime==1 ? 0
: RowFactor==1 ? row
: row%m_matrix.rows();
const int actual_col = ei_traits<MatrixType>::ColsAtCompileTime==1 ? 0
: ColFactor==1 ? col
: col%m_matrix.cols();
return m_matrix.template packet<LoadMode>(actual_row, actual_col);
}
protected: protected:
const typename MatrixType::Nested m_matrix; const typename MatrixType::Nested m_matrix;