aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Sparse/SparseBlock.h
diff options
context:
space:
mode:
Diffstat (limited to 'Eigen/src/Sparse/SparseBlock.h')
-rw-r--r--Eigen/src/Sparse/SparseBlock.h75
1 files changed, 71 insertions, 4 deletions
diff --git a/Eigen/src/Sparse/SparseBlock.h b/Eigen/src/Sparse/SparseBlock.h
index 55590d9e2..48be3754f 100644
--- a/Eigen/src/Sparse/SparseBlock.h
+++ b/Eigen/src/Sparse/SparseBlock.h
@@ -23,9 +23,76 @@
// License and a copy of the GNU General Public License along with
// Eigen. If not, see <http://www.gnu.org/licenses/>.
-#ifndef EIGEN_SPARSEBLOCK_H
-#define EIGEN_SPARSEBLOCK_H
+#ifndef EIGEN_SPARSE_BLOCK_H
+#define EIGEN_SPARSE_BLOCK_H
+template<typename MatrixType>
+struct ei_traits<SparseInnerVector<MatrixType> >
+{
+ typedef typename ei_traits<MatrixType>::Scalar Scalar;
+ enum {
+ IsRowMajor = (int(MatrixType::Flags)&RowMajorBit)==RowMajorBit,
+ Flags = MatrixType::Flags,
+ RowsAtCompileTime = IsRowMajor ? 1 : MatrixType::RowsAtCompileTime,
+ ColsAtCompileTime = IsRowMajor ? MatrixType::ColsAtCompileTime : 1,
+ CoeffReadCost = MatrixType::CoeffReadCost
+ };
+};
+
+template<typename MatrixType>
+class SparseInnerVector : ei_no_assignment_operator,
+ public SparseMatrixBase<SparseInnerVector<MatrixType> >
+{
+ enum {
+ IsRowMajor = ei_traits<SparseInnerVector>::IsRowMajor
+ };
+public:
+
+ EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseInnerVector)
+ class InnerIterator;
+
+ inline SparseInnerVector(const MatrixType& matrix, int outer)
+ : m_matrix(matrix), m_outer(outer)
+ {
+ ei_assert( (outer>=0) && (outer<matrix.outerSize()) );
+ }
+
+ EIGEN_STRONG_INLINE int rows() const { return IsRowMajor ? 1 : m_matrix.rows(); }
+ EIGEN_STRONG_INLINE int cols() const { return IsRowMajor ? m_matrix.cols() : 1; }
+
+ protected:
+
+ const typename MatrixType::Nested m_matrix;
+ int m_outer;
+
+};
+
+template<typename MatrixType>
+class SparseInnerVector<MatrixType>::InnerIterator : public MatrixType::InnerIterator
+{
+public:
+ inline InnerIterator(const SparseInnerVector& xpr, int outer=0)
+ : MatrixType::InnerIterator(xpr.m_matrix, xpr.m_outer)
+ {
+ ei_assert(outer==0);
+ }
+};
+
+/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
+ * is col-major (resp. row-major).
+ */
+template<typename Derived>
+SparseInnerVector<Derived> SparseMatrixBase<Derived>::innerVector(int outer)
+{ return SparseInnerVector<Derived>(derived(), outer); }
+
+/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
+ * is col-major (resp. row-major). Read-only.
+ */
+template<typename Derived>
+const SparseInnerVector<Derived> SparseMatrixBase<Derived>::innerVector(int outer) const
+{ return SparseInnerVector<Derived>(derived(), outer); }
+
+# if 0
template<typename MatrixType, int BlockRows, int BlockCols, int PacketAccess>
class Block<MatrixType,BlockRows,BlockCols,PacketAccess,IsSparse>
: public SparseMatrixBase<Block<MatrixType,BlockRows,BlockCols,PacketAccess,IsSparse> >
@@ -117,6 +184,6 @@ public:
const ei_int_if_dynamic<ColsAtCompileTime> m_blockCols;
};
+#endif
-
-#endif // EIGEN_SPARSEBLOCK_H
+#endif // EIGEN_SPARSE_BLOCK_H