Re: [eigen] Feature suggestion: interior row and column ranges [patch attached]

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Hi all,

Attachments:
1. patch with {row,col}Range() renamed to middle{Rows,Cols}() and updated 
test-case file
2. Example files referred to in the Doxygen documentation
3. Corresponding sample output files

Notes:
The Doxygen comments in Block.h refer to MatrixBase_*.cpp as the example 
files. I think these should be renamed to DenseBase_*.cpp. So far I have 
followed the existing nomenclature in my patch. I am guessing that at the 
right time one of the maintainers will run a script to make this correction.

thanks,
Manoj




On Tuesday 29 June 2010 01:39:57 pm Gael Guennebaud wrote:
> you can export a range of commit this way:
>
> hg export rev_start:rev_end,
>
> e.g.:
>
> hg export 3090:tip
>
> gael
>
> On Tue, Jun 29, 2010 at 6:50 PM, Manoj Rajagopalan <rmanoj@xxxxxxxxx> wrote:
> > I made the changes and performed a local commit without rollback on the
> > previous local commit. Now the hg export tip > diff-file stores only the
> > diff with respect to the last local commit and not with respect to the
> > file-versions in the hg repo.
> >
> > How do I fix this problem? I performed one rollback (after making a copy
> > of the latest file with all desirable changes) and I got back the file
> > with rowRange() instead of middleRows(). Now I need to replace this with
> > the file in the repo. "hg revert DenseBase.h" doesn't seem to have any
> > effect.
> >
> > thanks,
> > Manoj
> >
> > On Sunday 27 June 2010 12:25:31 pm Benoit Jacob wrote:
> >> 2010/6/27 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:
> >> > 2010/6/27 Manoj Rajagopalan <rmanoj@xxxxxxxxx>:
> >> >> Do you want me to resend the patch with the new names - middleRows()
> >> >> and middleCols()?
> >> >
> >> > Yes please and also make sure to indent with spaces, not tabs, in
> >> > DenseBase.h
> >>
> >> Also please update test/corners.cpp to test all your new functions.
> >> And yes, that filename becomes not so good anymore, but let's take
> >> care of that later.
> >>
> >> Benoit
> >>
> >> > Benoit
> >> >
> >> >> Thanks,
> >> >> Manoj

# HG changeset patch
# User Manoj Rajagopalan <rmanoj@xxxxxxxxx>
# Date 1277588237 14400
# Node ID 005e59ee039e8edbf6056361b057022fbdacb40a
# Parent  687dca0e53d43b123e64e8640a08827de3fa0429
Included definitions for rowRange() and colRange() member functions of DenseBase

diff -r 687dca0e53d4 -r 005e59ee039e Eigen/src/Core/Block.h
--- a/Eigen/src/Core/Block.h	Sat Jun 26 23:15:06 2010 +0200
+++ b/Eigen/src/Core/Block.h	Sat Jun 26 17:37:17 2010 -0400
@@ -678,9 +678,62 @@ DenseBase<Derived>::bottomRows() const
 
 
 
+/** \returns a block consisting of a range of rows of *this.
+  *
+  * \param startRow the index of the first row in the block
+  * \param numRows the number of rows in the block
+  *
+  * Example: \include MatrixBase_rowRange_int.cpp
+  * Output: \verbinclude MatrixBase_rowRange_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<typename Derived>
+inline typename DenseBase<Derived>::RowsBlockXpr DenseBase<Derived>
+  ::rowRange(Index startRow, Index numRows)
+{
+  return RowsBlockXpr(derived(), startRow, 0, numRows, cols());
+}
 
+/** This is the const version of rowRange(Index,Index).*/
+template<typename Derived>
+inline const typename DenseBase<Derived>::RowsBlockXpr
+DenseBase<Derived>::rowRange(Index startRow, Index numRows) const
+{
+  return RowsBlockXpr(derived(), startRow, 0, numRows, cols());
+}
 
-/** \returns a block consisting of the top columns of *this.
+/** \returns a block consisting of a range of rows of *this.
+  *
+  * \param N the number of rows in the block
+  * \param startRow the index of the first row in the block
+  *
+  * Example: \include MatrixBase_template_int_rowRange.cpp
+  * Output: \verbinclude MatrixBase_template_int_rowRange.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<typename Derived>
+template<int N>
+inline typename DenseBase<Derived>::template NRowsBlockXpr<N>::Type
+DenseBase<Derived>::rowRange(Index startRow)
+{
+  return typename DenseBase<Derived>::template NRowsBlockXpr<N>::Type(derived(), startRow, 0, N, cols());
+}
+
+/** This is the const version of rowRange<int>().*/
+template<typename Derived>
+template<int N>
+inline const typename DenseBase<Derived>::template NRowsBlockXpr<N>::Type
+DenseBase<Derived>::rowRange(Index startRow) const
+{
+  return typename DenseBase<Derived>::template NRowsBlockXpr<N>::Type(derived(), startRow, 0, N, cols());
+}
+
+
+
+
+/** \returns a block consisting of the left columns of *this.
   *
   * \param n the number of columns in the block
   *
@@ -782,6 +835,61 @@ DenseBase<Derived>::rightCols() const
 DenseBase<Derived>::rightCols() const
 {
   return typename DenseBase<Derived>::template NColsBlockXpr<N>::Type(derived(), 0, cols() - N, rows(), N);
+}
+
+
+
+
+/** \returns a block consisting of a range of columns of *this.
+  *
+  * \param startCol the index of the first column in the block
+  * \param numCols the number of columns in the block
+  *
+  * Example: \include MatrixBase_colRange_int.cpp
+  * Output: \verbinclude MatrixBase_colRange_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<typename Derived>
+inline typename DenseBase<Derived>::ColsBlockXpr DenseBase<Derived>
+  ::colRange(Index startCol, Index numCols)
+{
+  return ColsBlockXpr(derived(), 0, startCol, rows(), numCols);
+}
+
+/** This is the const version of colRange(Index,Index).*/
+template<typename Derived>
+inline const typename DenseBase<Derived>::ColsBlockXpr
+DenseBase<Derived>::colRange(Index startCol, Index numCols) const
+{
+  return ColsBlockXpr(derived(), 0, startCol, rows(), numCols);
+}
+
+/** \returns a block consisting of a range of columns of *this.
+  *
+  * \param N the number of columns in the block
+  * \param startCol the index of the first column in the block
+  *
+  * Example: \include MatrixBase_template_int_colRange.cpp
+  * Output: \verbinclude MatrixBase_template_int_colRange.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<typename Derived>
+template<int N>
+inline typename DenseBase<Derived>::template NColsBlockXpr<N>::Type
+DenseBase<Derived>::colRange(Index startCol)
+{
+  return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), N);
+}
+
+/** This is the const version of colRange<int>().*/
+template<typename Derived>
+template<int N>
+inline const typename DenseBase<Derived>::template NColsBlockXpr<N>::Type
+DenseBase<Derived>::colRange(Index startCol) const
+{
+  return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), N);
 }
 
 
diff -r 687dca0e53d4 -r 005e59ee039e Eigen/src/Core/DenseBase.h
--- a/Eigen/src/Core/DenseBase.h	Sat Jun 26 23:15:06 2010 +0200
+++ b/Eigen/src/Core/DenseBase.h	Sat Jun 26 17:37:17 2010 -0400
@@ -326,10 +326,14 @@ template<typename Derived> class DenseBa
     const RowsBlockXpr topRows(Index n) const;
     RowsBlockXpr       bottomRows(Index n);
     const RowsBlockXpr bottomRows(Index n) const;
+	RowsBlockXpr       rowRange(Index startRow, Index numRows);
+	const RowsBlockXpr rowRange(Index startRow, Index numRows) const;
     ColsBlockXpr       leftCols(Index n);
     const ColsBlockXpr leftCols(Index n) const;
     ColsBlockXpr       rightCols(Index n);
     const ColsBlockXpr rightCols(Index n) const;
+	ColsBlockXpr       colRange(Index startCol, Index numCols);
+	const ColsBlockXpr colRange(Index startCol, Index numCols) const;
 
     template<int CRows, int CCols> Block<Derived, CRows, CCols>       topLeftCorner();
     template<int CRows, int CCols> const Block<Derived, CRows, CCols> topLeftCorner() const;
@@ -344,10 +348,14 @@ template<typename Derived> class DenseBa
     template<int NRows> const typename NRowsBlockXpr<NRows>::Type topRows() const;
     template<int NRows> typename NRowsBlockXpr<NRows>::Type       bottomRows();
     template<int NRows> const typename NRowsBlockXpr<NRows>::Type bottomRows() const;
+	template<int NRows> typename NRowsBlockXpr<NRows>::Type       rowRange(Index startRow);
+	template<int NRows> const typename NRowsBlockXpr<NRows>::Type rowRange(Index startRow) const;
     template<int NCols> typename NColsBlockXpr<NCols>::Type       leftCols();
     template<int NCols> const typename NColsBlockXpr<NCols>::Type leftCols() const;
     template<int NCols> typename NColsBlockXpr<NCols>::Type       rightCols();
     template<int NCols> const typename NColsBlockXpr<NCols>::Type rightCols() const;
+	template<int NCols> typename NColsBlockXpr<NCols>::Type       colRange(Index startCol);
+	template<int NCols> const typename NColsBlockXpr<NCols>::Type colRange(Index startCol) const;
 
     template<int BlockRows, int BlockCols>
     Block<Derived, BlockRows, BlockCols> block(Index startRow, Index startCol);
# HG changeset patch
# User Manoj Rajagopalan <rmanoj@xxxxxxxxx>
# Date 1277829598 14400
# Node ID 80184194ba92f590884da878fabb2487b376575f
# Parent  005e59ee039e8edbf6056361b057022fbdacb40a
Included tests for middleRows() and middleCols()

diff -r 005e59ee039e -r 80184194ba92 test/corners.cpp
--- a/test/corners.cpp	Sat Jun 26 17:37:17 2010 -0400
+++ b/test/corners.cpp	Tue Jun 29 12:39:58 2010 -0400
@@ -45,13 +45,20 @@ template<typename MatrixType> void corne
   COMPARE_CORNER(bottomLeftCorner(r,c), block(rows-r,0,r,c));
   COMPARE_CORNER(bottomRightCorner(r,c), block(rows-r,cols-c,r,c));
 
+  Index sr = ei_random<Index>(1,rows) - 1;
+  Index nr = ei_random<Index>(1,rows-sr);
+  Index sc = ei_random<Index>(1,cols) - 1;
+  Index nc = ei_random<Index>(1,cols-sc);
+
   COMPARE_CORNER(topRows(r), block(0,0,r,cols));
+  COMPARE_CORNER(middleRows(sr,nr), block(sr,0,nr,cols));
   COMPARE_CORNER(bottomRows(r), block(rows-r,0,r,cols));
   COMPARE_CORNER(leftCols(c), block(0,0,rows,c));
+  COMPARE_CORNER(middleCols(sc,nc), block(0,sc,rows,nc));
   COMPARE_CORNER(rightCols(c), block(0,cols-c,rows,c));
 }
 
-template<typename MatrixType, int CRows, int CCols> void corners_fixedsize()
+template<typename MatrixType, int CRows, int CCols, int SRows, int SCols> void corners_fixedsize()
 {
   MatrixType matrix = MatrixType::Random();
   const MatrixType const_matrix = MatrixType::Random();
@@ -60,7 +67,9 @@ template<typename MatrixType, int CRows,
     rows = MatrixType::RowsAtCompileTime,
     cols = MatrixType::ColsAtCompileTime,
     r = CRows,
-    c = CCols
+    c = CCols,
+	sr = SRows,
+	sc = SCols
   };
 
   VERIFY_IS_EQUAL((matrix.template topLeftCorner<r,c>()), (matrix.template block<r,c>(0,0)));
@@ -69,8 +78,10 @@ template<typename MatrixType, int CRows,
   VERIFY_IS_EQUAL((matrix.template bottomRightCorner<r,c>()), (matrix.template block<r,c>(rows-r,cols-c)));
 
   VERIFY_IS_EQUAL((matrix.template topRows<r>()), (matrix.template block<r,cols>(0,0)));
+  VERIFY_IS_EQUAL((matrix.template middleRows<r>(sr)), (matrix.template block<r,cols>(sr,0)));
   VERIFY_IS_EQUAL((matrix.template bottomRows<r>()), (matrix.template block<r,cols>(rows-r,0)));
   VERIFY_IS_EQUAL((matrix.template leftCols<c>()), (matrix.template block<rows,c>(0,0)));
+  VERIFY_IS_EQUAL((matrix.template middleCols<c>(sc)), (matrix.template block<rows,c>(0,sc)));
   VERIFY_IS_EQUAL((matrix.template rightCols<c>()), (matrix.template block<rows,c>(0,cols-c)));
 
   VERIFY_IS_EQUAL((const_matrix.template topLeftCorner<r,c>()), (const_matrix.template block<r,c>(0,0)));
@@ -79,8 +90,10 @@ template<typename MatrixType, int CRows,
   VERIFY_IS_EQUAL((const_matrix.template bottomRightCorner<r,c>()), (const_matrix.template block<r,c>(rows-r,cols-c)));
 
   VERIFY_IS_EQUAL((const_matrix.template topRows<r>()), (const_matrix.template block<r,cols>(0,0)));
+  VERIFY_IS_EQUAL((const_matrix.template middleRows<r>(sr)), (const_matrix.template block<r,cols>(sr,0)));
   VERIFY_IS_EQUAL((const_matrix.template bottomRows<r>()), (const_matrix.template block<r,cols>(rows-r,0)));
   VERIFY_IS_EQUAL((const_matrix.template leftCols<c>()), (const_matrix.template block<rows,c>(0,0)));
+  VERIFY_IS_EQUAL((const_matrix.template middleCols<c>(sc)), (const_matrix.template block<rows,c>(0,sc)));
   VERIFY_IS_EQUAL((const_matrix.template rightCols<c>()), (const_matrix.template block<rows,c>(0,cols-c)));
 }
 
@@ -93,8 +106,8 @@ void test_corners()
     CALL_SUBTEST_4( corners(MatrixXcf(5, 7)) );
     CALL_SUBTEST_5( corners(MatrixXf(21, 20)) );
 
-    CALL_SUBTEST_1(( corners_fixedsize<Matrix<float, 1, 1>, 1, 1>() ));
-    CALL_SUBTEST_2(( corners_fixedsize<Matrix4d,2,2>() ));
-    CALL_SUBTEST_3(( corners_fixedsize<Matrix<int,10,12>,4,7>() ));
+    CALL_SUBTEST_1(( corners_fixedsize<Matrix<float, 1, 1>, 1, 1, 0, 0>() ));
+    CALL_SUBTEST_2(( corners_fixedsize<Matrix4d,2,2,1,1>() ));
+    CALL_SUBTEST_3(( corners_fixedsize<Matrix<int,10,12>,4,7,5,2>() ));
   }
 }
# HG changeset patch
# User Manoj Rajagopalan <rmanoj@xxxxxxxxx>
# Date 1277836299 14400
# Node ID a8d1f57c46bc5ce62a4536d118efe5b1f88e9436
# Parent  80184194ba92f590884da878fabb2487b376575f
Renamed DenseBase::{row,col}Range() to DenseBase::middle{Rows,Cols}()

diff -r 80184194ba92 -r a8d1f57c46bc Eigen/src/Core/Block.h
--- a/Eigen/src/Core/Block.h	Tue Jun 29 12:39:58 2010 -0400
+++ b/Eigen/src/Core/Block.h	Tue Jun 29 14:31:39 2010 -0400
@@ -683,22 +683,22 @@ DenseBase<Derived>::bottomRows() const
   * \param startRow the index of the first row in the block
   * \param numRows the number of rows in the block
   *
-  * Example: \include MatrixBase_rowRange_int.cpp
-  * Output: \verbinclude MatrixBase_rowRange_int.out
+  * Example: \include MatrixBase_middleRows_int.cpp
+  * Output: \verbinclude MatrixBase_middleRows_int.out
   *
   * \sa class Block, block(Index,Index,Index,Index)
   */
 template<typename Derived>
 inline typename DenseBase<Derived>::RowsBlockXpr DenseBase<Derived>
-  ::rowRange(Index startRow, Index numRows)
+  ::middleRows(Index startRow, Index numRows)
 {
   return RowsBlockXpr(derived(), startRow, 0, numRows, cols());
 }
 
-/** This is the const version of rowRange(Index,Index).*/
+/** This is the const version of middleRows(Index,Index).*/
 template<typename Derived>
 inline const typename DenseBase<Derived>::RowsBlockXpr
-DenseBase<Derived>::rowRange(Index startRow, Index numRows) const
+DenseBase<Derived>::middleRows(Index startRow, Index numRows) const
 {
   return RowsBlockXpr(derived(), startRow, 0, numRows, cols());
 }
@@ -708,24 +708,24 @@ DenseBase<Derived>::rowRange(Index start
   * \param N the number of rows in the block
   * \param startRow the index of the first row in the block
   *
-  * Example: \include MatrixBase_template_int_rowRange.cpp
-  * Output: \verbinclude MatrixBase_template_int_rowRange.out
+  * Example: \include MatrixBase_template_int_middleRows.cpp
+  * Output: \verbinclude MatrixBase_template_int_middleRows.out
   *
   * \sa class Block, block(Index,Index,Index,Index)
   */
 template<typename Derived>
 template<int N>
 inline typename DenseBase<Derived>::template NRowsBlockXpr<N>::Type
-DenseBase<Derived>::rowRange(Index startRow)
+DenseBase<Derived>::middleRows(Index startRow)
 {
   return typename DenseBase<Derived>::template NRowsBlockXpr<N>::Type(derived(), startRow, 0, N, cols());
 }
 
-/** This is the const version of rowRange<int>().*/
+/** This is the const version of middleRows<int>().*/
 template<typename Derived>
 template<int N>
 inline const typename DenseBase<Derived>::template NRowsBlockXpr<N>::Type
-DenseBase<Derived>::rowRange(Index startRow) const
+DenseBase<Derived>::middleRows(Index startRow) const
 {
   return typename DenseBase<Derived>::template NRowsBlockXpr<N>::Type(derived(), startRow, 0, N, cols());
 }
@@ -845,22 +845,22 @@ DenseBase<Derived>::rightCols() const
   * \param startCol the index of the first column in the block
   * \param numCols the number of columns in the block
   *
-  * Example: \include MatrixBase_colRange_int.cpp
-  * Output: \verbinclude MatrixBase_colRange_int.out
+  * Example: \include MatrixBase_middleCols_int.cpp
+  * Output: \verbinclude MatrixBase_middleCols_int.out
   *
   * \sa class Block, block(Index,Index,Index,Index)
   */
 template<typename Derived>
 inline typename DenseBase<Derived>::ColsBlockXpr DenseBase<Derived>
-  ::colRange(Index startCol, Index numCols)
+  ::middleCols(Index startCol, Index numCols)
 {
   return ColsBlockXpr(derived(), 0, startCol, rows(), numCols);
 }
 
-/** This is the const version of colRange(Index,Index).*/
+/** This is the const version of middleCols(Index,Index).*/
 template<typename Derived>
 inline const typename DenseBase<Derived>::ColsBlockXpr
-DenseBase<Derived>::colRange(Index startCol, Index numCols) const
+DenseBase<Derived>::middleCols(Index startCol, Index numCols) const
 {
   return ColsBlockXpr(derived(), 0, startCol, rows(), numCols);
 }
@@ -870,24 +870,24 @@ DenseBase<Derived>::colRange(Index start
   * \param N the number of columns in the block
   * \param startCol the index of the first column in the block
   *
-  * Example: \include MatrixBase_template_int_colRange.cpp
-  * Output: \verbinclude MatrixBase_template_int_colRange.out
+  * Example: \include MatrixBase_template_int_middleCols.cpp
+  * Output: \verbinclude MatrixBase_template_int_middleCols.out
   *
   * \sa class Block, block(Index,Index,Index,Index)
   */
 template<typename Derived>
 template<int N>
 inline typename DenseBase<Derived>::template NColsBlockXpr<N>::Type
-DenseBase<Derived>::colRange(Index startCol)
+DenseBase<Derived>::middleCols(Index startCol)
 {
   return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), N);
 }
 
-/** This is the const version of colRange<int>().*/
+/** This is the const version of middleCols<int>().*/
 template<typename Derived>
 template<int N>
 inline const typename DenseBase<Derived>::template NColsBlockXpr<N>::Type
-DenseBase<Derived>::colRange(Index startCol) const
+DenseBase<Derived>::middleCols(Index startCol) const
 {
   return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), N);
 }
diff -r 80184194ba92 -r a8d1f57c46bc Eigen/src/Core/DenseBase.h
--- a/Eigen/src/Core/DenseBase.h	Tue Jun 29 12:39:58 2010 -0400
+++ b/Eigen/src/Core/DenseBase.h	Tue Jun 29 14:31:39 2010 -0400
@@ -326,14 +326,14 @@ template<typename Derived> class DenseBa
     const RowsBlockXpr topRows(Index n) const;
     RowsBlockXpr       bottomRows(Index n);
     const RowsBlockXpr bottomRows(Index n) const;
-	RowsBlockXpr       rowRange(Index startRow, Index numRows);
-	const RowsBlockXpr rowRange(Index startRow, Index numRows) const;
+	RowsBlockXpr       middleRows(Index startRow, Index numRows);
+	const RowsBlockXpr middleRows(Index startRow, Index numRows) const;
     ColsBlockXpr       leftCols(Index n);
     const ColsBlockXpr leftCols(Index n) const;
     ColsBlockXpr       rightCols(Index n);
     const ColsBlockXpr rightCols(Index n) const;
-	ColsBlockXpr       colRange(Index startCol, Index numCols);
-	const ColsBlockXpr colRange(Index startCol, Index numCols) const;
+	ColsBlockXpr       middleCols(Index startCol, Index numCols);
+	const ColsBlockXpr middleCols(Index startCol, Index numCols) const;
 
     template<int CRows, int CCols> Block<Derived, CRows, CCols>       topLeftCorner();
     template<int CRows, int CCols> const Block<Derived, CRows, CCols> topLeftCorner() const;
@@ -348,14 +348,14 @@ template<typename Derived> class DenseBa
     template<int NRows> const typename NRowsBlockXpr<NRows>::Type topRows() const;
     template<int NRows> typename NRowsBlockXpr<NRows>::Type       bottomRows();
     template<int NRows> const typename NRowsBlockXpr<NRows>::Type bottomRows() const;
-	template<int NRows> typename NRowsBlockXpr<NRows>::Type       rowRange(Index startRow);
-	template<int NRows> const typename NRowsBlockXpr<NRows>::Type rowRange(Index startRow) const;
+	template<int NRows> typename NRowsBlockXpr<NRows>::Type       middleRows(Index startRow);
+	template<int NRows> const typename NRowsBlockXpr<NRows>::Type middleRows(Index startRow) const;
     template<int NCols> typename NColsBlockXpr<NCols>::Type       leftCols();
     template<int NCols> const typename NColsBlockXpr<NCols>::Type leftCols() const;
     template<int NCols> typename NColsBlockXpr<NCols>::Type       rightCols();
     template<int NCols> const typename NColsBlockXpr<NCols>::Type rightCols() const;
-	template<int NCols> typename NColsBlockXpr<NCols>::Type       colRange(Index startCol);
-	template<int NCols> const typename NColsBlockXpr<NCols>::Type colRange(Index startCol) const;
+	template<int NCols> typename NColsBlockXpr<NCols>::Type       middleCols(Index startCol);
+	template<int NCols> const typename NColsBlockXpr<NCols>::Type middleCols(Index startCol) const;
 
     template<int BlockRows, int BlockCols>
     Block<Derived, BlockRows, BlockCols> block(Index startRow, Index startCol);

Attachment: MatrixBase_middleCols_int.out
Description: chemical/mopac-out

#include <Eigen/Core>
#include <iostream>

using namespace Eigen;
using namespace std;

int main(void)
{
	int const N = 5;
	MatrixXi A(N,N);
	A.setRandom();
	cout << "A =\n" << A << '\n' << endl;
	cout << "A(1..3,:) =\n" << A.middleCols(1,3) << endl;
	return 0;
}

#include <eigen-aliases.h>
#include <iostream>
#include "fill_seq.h"

using namespace Eigen;
using namespace eigen_aliases;
using namespace std;

int main(void)
{
	int const N = 5;
	MatrixXi A(N,N);
	A.setRandom();
	cout << "A =\n" << A << '\n' << endl;
	cout << "A(2..3,:) =\n" << A.middleRows(2,2) << endl;
	return 0;
}

#include <Eigen/Core>
#include <iostream>

using namespace Eigen;
using namespace std;

int main(void)
{
	int const N = 5;
	MatrixXi A(N,N);
	A.setRandom();
	cout << "A =\n" << A << '\n' << endl;
	cout << "A(:,1..3) =\n" << A.middleCols<3>(1) << endl;
	return 0;
}

Attachment: MatrixBase_template_int_middleCols.out
Description: chemical/mopac-out

#include <Eigen/Core>
#include <iostream>

using namespace Eigen;
using namespace std;

int main(void)
{
	int const N = 5;
	MatrixXi A(N,N);
	A.setRandom();
	cout << "A =\n" << A << '\n' << endl;
	cout << "A(1..3,:) =\n" << A.middleRows<3>(1) << endl;
	return 0;
}


Attachment: MatrixBase_middleRows_int.out
Description: chemical/mopac-out

Attachment: MatrixBase_template_int_middleRows.out
Description: chemical/mopac-out



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/