aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Jitse Niesen <jitse@maths.leeds.ac.uk>2010-05-31 14:42:04 +0100
committerGravatar Jitse Niesen <jitse@maths.leeds.ac.uk>2010-05-31 14:42:04 +0100
commitc21390a6113e7d9759217dffef9361576decbaa0 (patch)
tree705d27e1493c965c62ee0af8d03326a743fbb751
parent07a65dd02b2e454de83f5b78ea290b2e90593c11 (diff)
Define non-const operator() in Reverse; enable test for this.
Introduction of DenseCoeffBase (revision bfdc1c49730c79e6058ba1506628341559670c25 ) meant that non-const operator() is only defined if DirectAccess is set. This caused the line "m.reverse()(1,0) = 4;" in MatrixBase_reverse.cpp to fail at compile-time. Not sure this is correct solution; perhaps we should disallow this? Or make Reverse DirectAccess with a negative stride - would that break something?
-rw-r--r--Eigen/src/Array/Reverse.h16
-rw-r--r--Eigen/src/Array/VectorwiseOp.h4
-rw-r--r--test/array_reverse.cpp42
3 files changed, 19 insertions, 43 deletions
diff --git a/Eigen/src/Array/Reverse.h b/Eigen/src/Array/Reverse.h
index cca425142..2d7510902 100644
--- a/Eigen/src/Array/Reverse.h
+++ b/Eigen/src/Array/Reverse.h
@@ -84,6 +84,10 @@ template<typename MatrixType, int Direction> class Reverse
EIGEN_DENSE_PUBLIC_INTERFACE(Reverse)
using Base::IsRowMajor;
+ // next line is necessary because otherwise const version of operator()
+ // is hidden by non-const version defined in this file
+ using Base::operator();
+
protected:
enum {
PacketSize = ei_packet_traits<Scalar>::size,
@@ -106,6 +110,12 @@ template<typename MatrixType, int Direction> class Reverse
inline Index rows() const { return m_matrix.rows(); }
inline Index cols() const { return m_matrix.cols(); }
+ inline Scalar& operator()(Index row, Index col)
+ {
+ ei_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
+ return coeffRef(row, col);
+ }
+
inline Scalar& coeffRef(Index row, Index col)
{
return m_matrix.const_cast_derived().coeffRef(ReverseRow ? m_matrix.rows() - row - 1 : row,
@@ -128,6 +138,12 @@ template<typename MatrixType, int Direction> class Reverse
return m_matrix.const_cast_derived().coeffRef(m_matrix.size() - index - 1);
}
+ inline Scalar& operator()(Index index)
+ {
+ ei_assert(index >= 0 && index < m_matrix.size());
+ return coeffRef(index);
+ }
+
template<int LoadMode>
inline const PacketScalar packet(Index row, Index col) const
{
diff --git a/Eigen/src/Array/VectorwiseOp.h b/Eigen/src/Array/VectorwiseOp.h
index e338a9193..2aa382df2 100644
--- a/Eigen/src/Array/VectorwiseOp.h
+++ b/Eigen/src/Array/VectorwiseOp.h
@@ -380,8 +380,8 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
/** \returns a matrix expression
* where each column (or row) are reversed.
*
- * Example: \include PartialRedux_reverse.cpp
- * Output: \verbinclude PartialRedux_reverse.out
+ * Example: \include VectorWise_reverse.cpp
+ * Output: \verbinclude VectorWise_reverse.out
*
* \sa DenseBase::reverse() */
const Reverse<ExpressionType, Direction> reverse() const
diff --git a/test/array_reverse.cpp b/test/array_reverse.cpp
index ccf8dcc87..3933ff523 100644
--- a/test/array_reverse.cpp
+++ b/test/array_reverse.cpp
@@ -103,47 +103,6 @@ template<typename MatrixType> void reverse(const MatrixType& m)
}
}
- /*
- cout << "m1:" << endl << m1 << endl;
- cout << "m1c_reversed:" << endl << m1c_reversed << endl;
-
- cout << "----------------" << endl;
-
- for ( int i=0; i< rows*cols; i++){
- cout << m1c_reversed.coeff(i) << endl;
- }
-
- cout << "----------------" << endl;
-
- for ( int i=0; i< rows*cols; i++){
- cout << m1c_reversed.colwise().reverse().coeff(i) << endl;
- }
-
- cout << "================" << endl;
-
- cout << "m1.coeff( ind ): " << m1.coeff( ind ) << endl;
- cout << "m1c_reversed.colwise().reverse().coeff( ind ): " << m1c_reversed.colwise().reverse().coeff( ind ) << endl;
- */
-
- //MatrixType m1r_reversed = m1.rowwise().reverse();
- //VERIFY_IS_APPROX( m1r_reversed.rowwise().reverse().coeff( ind ), m1.coeff( ind ) );
-
- /*
- cout << "m1" << endl << m1 << endl;
- cout << "m1 using coeff(int index)" << endl;
- for ( int i = 0; i < rows*cols; i++) {
- cout << m1.coeff(i) << " ";
- }
- cout << endl;
-
- cout << "m1.transpose()" << endl << m1.transpose() << endl;
- cout << "m1.transpose() using coeff(int index)" << endl;
- for ( int i = 0; i < rows*cols; i++) {
- cout << m1.transpose().coeff(i) << " ";
- }
- cout << endl;
- */
- /*
Scalar x = ei_random<Scalar>();
int r = ei_random<int>(0, rows-1),
@@ -152,6 +111,7 @@ template<typename MatrixType> void reverse(const MatrixType& m)
m1.reverse()(r, c) = x;
VERIFY_IS_APPROX(x, m1(rows - 1 - r, cols - 1 - c));
+ /*
m1.colwise().reverse()(r, c) = x;
VERIFY_IS_APPROX(x, m1(rows - 1 - r, c));