Add missing specialization of evaluator of sub-sparse-matrices that can be seen as a SparseCompressedBase. This changeset enable faster iterator for such expressions.
diff --git a/Eigen/src/SparseCore/SparseBlock.h b/Eigen/src/SparseCore/SparseBlock.h
index b41e8f1..333cc66 100644
--- a/Eigen/src/SparseCore/SparseBlock.h
+++ b/Eigen/src/SparseCore/SparseBlock.h
@@ -535,6 +535,24 @@
   inline operator bool() const { return m_outerPos < m_end; }

 };

 

+template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>

+struct unary_evaluator<Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true>, IteratorBased>

+  : evaluator<SparseCompressedBase<Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> > >

+{

+  typedef Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> XprType;

+  typedef evaluator<SparseCompressedBase<XprType> > Base;

+  explicit unary_evaluator(const XprType &xpr) : Base(xpr) {}

+};

+

+template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>

+struct unary_evaluator<Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true>, IteratorBased>

+  : evaluator<SparseCompressedBase<Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> > >

+{

+  typedef Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> XprType;

+  typedef evaluator<SparseCompressedBase<XprType> > Base;

+  explicit unary_evaluator(const XprType &xpr) : Base(xpr) {}

+};

+

 } // end namespace internal