[mlpack-git] master, mlpack-1.0.x: Patch from sumedh: Mat::row_col_iterator (3c4b4d8)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Thu Mar 5 21:54:39 EST 2015


Repository : https://github.com/mlpack/mlpack

On branches: master,mlpack-1.0.x
Link       : https://github.com/mlpack/mlpack/compare/904762495c039e345beba14c1142fd719b3bd50e...f94823c800ad6f7266995c700b1b630d5ffdcf40

>---------------------------------------------------------------

commit 3c4b4d86b4a637fde5383c0ddc046a9f11cbcf17
Author: Ryan Curtin <ryan at ratml.org>
Date:   Fri Jul 25 21:24:04 2014 +0000

    Patch from sumedh: Mat::row_col_iterator


>---------------------------------------------------------------

3c4b4d86b4a637fde5383c0ddc046a9f11cbcf17
 src/mlpack/core/arma_extend/CMakeLists.txt      |   2 +
 src/mlpack/core/arma_extend/Mat_extra_bones.hpp | 136 +++++++++
 src/mlpack/core/arma_extend/Mat_extra_meat.hpp  | 378 ++++++++++++++++++++++++
 src/mlpack/core/arma_extend/arma_extend.hpp     |   4 +
 4 files changed, 520 insertions(+)

diff --git a/src/mlpack/core/arma_extend/CMakeLists.txt b/src/mlpack/core/arma_extend/CMakeLists.txt
index 9098cd0..50b3cad 100644
--- a/src/mlpack/core/arma_extend/CMakeLists.txt
+++ b/src/mlpack/core/arma_extend/CMakeLists.txt
@@ -14,6 +14,8 @@ set(SOURCES
   typedef.hpp
   SpMat_extra_bones.hpp
   SpMat_extra_meat.hpp
+  Mat_extra_bones.hpp
+  Mat_extra_meat.hpp
 )
 
 # add directory name to sources
diff --git a/src/mlpack/core/arma_extend/Mat_extra_bones.hpp b/src/mlpack/core/arma_extend/Mat_extra_bones.hpp
new file mode 100644
index 0000000..fb307fc
--- /dev/null
+++ b/src/mlpack/core/arma_extend/Mat_extra_bones.hpp
@@ -0,0 +1,136 @@
+/*
+ * Add row_col_iterator and row_col_const_iterator to arma::Mat.
+ */
+
+/*
+ * row_col_iterator for Mat<eT>. This iterator can return row and column index 
+ * of the entry its pointing too. The functionality of this iterator is similar
+ * to sparse matrix iterators. 
+ */
+
+class row_col_iterator; 
+ 
+class const_row_col_iterator
+{
+public:
+  // empty constructor
+  inline const_row_col_iterator();
+  // constructs const iterator from other iterators
+  inline const_row_col_iterator(const row_col_iterator& it);
+  inline const_row_col_iterator(const const_row_iterator& it);
+  inline const_row_col_iterator(const row_iterator& it);
+  // constructs iterator with given row and col index
+  inline const_row_col_iterator(const Mat<eT>& in_M, const uword row = 0, const uword col = 0);
+  
+  /*
+   * Returns the value of the current position.
+   */
+  inline arma_hot const eT& operator*() const { return *current_pos; }
+  
+  /*
+   * Increment and decrement operators for this iterator.
+   */
+  inline arma_hot const_row_col_iterator& operator++();
+  inline arma_hot const_row_col_iterator  operator++(int);
+  inline arma_hot const_row_col_iterator& operator--();
+  inline arma_hot const_row_col_iterator  operator--(int);
+  
+  /*
+   * Comparison operator with itself and other relevant iterators.
+   */
+  inline arma_hot bool operator==(const const_row_col_iterator& rhs) const;
+  inline arma_hot bool operator!=(const const_row_col_iterator& rhs) const;
+  inline arma_hot bool operator==(const row_col_iterator& rhs) const;
+  inline arma_hot bool operator!=(const row_col_iterator& rhs) const;
+  inline arma_hot bool operator==(const const_iterator& rhs) const;
+  inline arma_hot bool operator!=(const const_iterator& rhs) const;  
+  inline arma_hot bool operator==(const iterator& rhs) const;
+  inline arma_hot bool operator!=(const iterator& rhs) const;  
+  inline arma_hot bool operator==(const const_row_iterator& rhs) const;
+  inline arma_hot bool operator!=(const const_row_iterator& rhs) const; 
+  inline arma_hot bool operator==(const row_iterator& rhs) const;
+  inline arma_hot bool operator!=(const row_iterator& rhs) const; 
+  
+  arma_inline uword row() const { return internal_row; }
+  arma_inline uword col() const { return internal_col; }
+
+  // So that we satisfy the STL iterator types.
+  typedef std::bidirectional_iterator_tag iterator_category;
+  typedef eT                              value_type;
+  typedef uword                           difference_type; // not certain on this one
+  typedef const eT*                       pointer;
+  typedef const eT&                       reference;
+  
+  arma_aligned const Mat<eT>* M;
+  
+  arma_aligned const eT* current_pos;
+  arma_aligned       uword  internal_col;
+  arma_aligned       uword  internal_row;
+};
+
+class row_col_iterator
+{
+public:
+  // empty constructor
+  inline row_col_iterator();
+  // constructs const iterator from other iterators
+  inline row_col_iterator(const row_iterator& it);
+  // constructs iterator with given row and col index
+  inline row_col_iterator(Mat<eT>& in_M, const uword row = 0, const uword col = 0);
+  
+  /*
+   * Returns the value of the current position.
+   */
+  inline arma_hot eT& operator*() const { return *current_pos; }
+  
+  /*
+   * Increment and decrement operators for this iterator.
+   */
+  inline arma_hot row_col_iterator& operator++();
+  inline arma_hot row_col_iterator  operator++(int);
+  inline arma_hot row_col_iterator& operator--();
+  inline arma_hot row_col_iterator  operator--(int);
+  
+  /*
+   * Comparison operator with itself and other relevant iterators.
+   */
+  inline arma_hot bool operator==(const const_row_col_iterator& rhs) const;
+  inline arma_hot bool operator!=(const const_row_col_iterator& rhs) const;
+  inline arma_hot bool operator==(const row_col_iterator& rhs) const;
+  inline arma_hot bool operator!=(const row_col_iterator& rhs) const;
+  inline arma_hot bool operator==(const const_iterator& rhs) const;
+  inline arma_hot bool operator!=(const const_iterator& rhs) const;
+  inline arma_hot bool operator==(const iterator& rhs) const;
+  inline arma_hot bool operator!=(const iterator& rhs) const;    
+  inline arma_hot bool operator==(const const_row_iterator& rhs) const;
+  inline arma_hot bool operator!=(const const_row_iterator& rhs) const; 
+  inline arma_hot bool operator==(const row_iterator& rhs) const;
+  inline arma_hot bool operator!=(const row_iterator& rhs) const; 
+  
+  arma_inline uword row() const { return internal_row; }
+  arma_inline uword col() const { return internal_col; }
+
+  // So that we satisfy the STL iterator types.
+  typedef std::bidirectional_iterator_tag iterator_category;
+  typedef eT                              value_type;
+  typedef uword                           difference_type; // not certain on this one
+  typedef const eT*                       pointer;
+  typedef const eT&                       reference;
+  
+  arma_aligned const Mat<eT>* M;
+  
+  arma_aligned       eT* current_pos;
+  arma_aligned       uword  internal_col;
+  arma_aligned       uword  internal_row;
+};
+
+/*
+ * Extra functions for Mat<eT>
+ */
+// begin for iterator row_col_iterator
+inline const_row_col_iterator begin_row_col() const;
+inline row_col_iterator begin_row_col();
+
+// end for iterator row_col_iterator
+inline const_row_col_iterator end_row_col() const;
+inline row_col_iterator end_row_col();
diff --git a/src/mlpack/core/arma_extend/Mat_extra_meat.hpp b/src/mlpack/core/arma_extend/Mat_extra_meat.hpp
new file mode 100644
index 0000000..a828e33
--- /dev/null
+++ b/src/mlpack/core/arma_extend/Mat_extra_meat.hpp
@@ -0,0 +1,378 @@
+///////////////////////////////////////////////////////////////////////////////
+// Mat::const_row_col_iterator implementation                                //
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename eT>
+inline 
+Mat<eT>::const_row_col_iterator::const_row_col_iterator()
+    : M(NULL), current_pos(NULL), internal_row(0), internal_col(0)
+{
+  // Technically this iterator is invalid (it may not point to a real element)
+}
+
+template<typename eT>
+inline 
+Mat<eT>::const_row_col_iterator::const_row_col_iterator(const row_col_iterator& it)
+    : M(it.M), current_pos(it.current_pos), internal_col(it.col()), internal_row(it.row()) 
+{
+  // Nothing to do.
+}
+
+template<typename eT>
+inline 
+Mat<eT>::const_row_col_iterator::const_row_col_iterator(const const_row_iterator& it)
+    : M(&it.M), current_pos(&it.M(it.row, it.col)), internal_col(it.col), internal_row(it.row) 
+{
+  // Nothing to do.
+}
+
+template<typename eT>
+inline 
+Mat<eT>::const_row_col_iterator::const_row_col_iterator(const row_iterator& it)
+    : M(&it.M), current_pos(&it.M(it.row, it.col)), internal_col(it.col), internal_row(it.row) 
+{
+  // Nothing to do.
+}
+
+
+template<typename eT>
+inline 
+Mat<eT>::const_row_col_iterator::const_row_col_iterator(const Mat<eT>& in_M, const uword row, const uword col)
+    : M(&in_M), current_pos(&in_M(row,col)), internal_row(row), internal_col(col)
+{
+  // Nothing to do.
+} 
+
+template<typename eT>
+inline typename Mat<eT>::const_row_col_iterator&
+Mat<eT>::const_row_col_iterator::operator++()
+{
+  current_pos++;
+  internal_row++;
+  
+  // Check to see if we moved a column.
+  if(internal_row == M->n_rows) 
+  {
+    internal_col++;
+    internal_row = 0;
+  }
+}
+
+template<typename eT>
+inline typename Mat<eT>::const_row_col_iterator
+Mat<eT>::const_row_col_iterator::operator++(int)
+{
+  typename Mat<eT>::const_row_col_iterator temp(*this);
+  
+  ++(*this);
+  
+  return temp;
+}
+
+template<typename eT>
+inline typename Mat<eT>::const_row_col_iterator&
+Mat<eT>::const_row_col_iterator::operator--()
+{
+  current_pos--;
+  internal_row--;
+  
+  // Check to see if we moved a column.
+  if(internal_row == -1) 
+  {
+    internal_col--;
+    internal_row = M->n_rows - 1;
+  }
+}
+
+template<typename eT>
+inline typename Mat<eT>::const_row_col_iterator
+Mat<eT>::const_row_col_iterator::operator--(int)
+{
+  typename Mat<eT>::const_row_col_iterator temp(*this);
+  
+  --(*this);
+  
+  return temp;
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator==(const const_row_col_iterator& rhs) const
+{
+  return (rhs.current_pos == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator!=(const const_row_col_iterator& rhs) const
+{
+  return (rhs.current_pos != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator==(const row_col_iterator& rhs) const
+{
+  return (rhs.current_pos == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator!=(const row_col_iterator& rhs) const
+{
+  return (rhs.current_pos != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator==(const const_iterator& rhs) const
+{
+  return (rhs == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator!=(const const_iterator& rhs) const
+{
+  return (rhs != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator==(const iterator& rhs) const
+{
+  return (rhs == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator!=(const iterator& rhs) const
+{
+  return (rhs != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator==(const const_row_iterator& rhs) const
+{
+  return (&rhs.M(rhs.row, rhs.col) == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator!=(const const_row_iterator& rhs) const
+{
+  return (&rhs.M(rhs.row, rhs.col) != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator==(const row_iterator& rhs) const
+{
+  return (&rhs.M(rhs.row, rhs.col) == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::const_row_col_iterator::operator!=(const row_iterator& rhs) const
+{
+  return (&rhs.M(rhs.row, rhs.col) != current_pos);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Mat::row_col_iterator implementation                                //
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename eT>
+inline 
+Mat<eT>::row_col_iterator::row_col_iterator()
+    : M(NULL), current_pos(NULL), internal_row(0), internal_col(0)
+{
+  // Technically this iterator is invalid (it may not point to a real element)
+}
+
+template<typename eT>
+inline 
+Mat<eT>::row_col_iterator::row_col_iterator(const row_iterator& it)
+    : M(&it.M), current_pos(&it.M(it.row, it.col)), internal_col(it.col), internal_row(it.row) 
+{
+  // Nothing to do.
+}
+
+
+template<typename eT>
+inline 
+Mat<eT>::row_col_iterator::row_col_iterator(Mat<eT>& in_M, const uword row, const uword col)
+    : M(&in_M), current_pos(&in_M(row,col)), internal_row(row), internal_col(col)
+{
+  // Nothing to do.
+} 
+
+template<typename eT>
+inline typename Mat<eT>::row_col_iterator&
+Mat<eT>::row_col_iterator::operator++()
+{
+  current_pos++;
+  internal_row++;
+  
+  // Check to see if we moved a column.
+  if(internal_row == M->n_rows) 
+  {
+    internal_col++;
+    internal_row = 0;
+  }
+}
+
+template<typename eT>
+inline typename Mat<eT>::row_col_iterator
+Mat<eT>::row_col_iterator::operator++(int)
+{
+  typename Mat<eT>::row_col_iterator temp(*this);
+  
+  ++(*this);
+  
+  return temp;
+}
+
+template<typename eT>
+inline typename Mat<eT>::row_col_iterator&
+Mat<eT>::row_col_iterator::operator--()
+{
+  current_pos--;
+  internal_row--;
+  
+  // Check to see if we moved a column.
+  if(internal_row == -1) 
+  {
+    internal_col--;
+    internal_row = M->n_rows - 1;
+  }
+}
+
+template<typename eT>
+inline typename Mat<eT>::row_col_iterator
+Mat<eT>::row_col_iterator::operator--(int)
+{
+  typename Mat<eT>::const_row_col_iterator temp(*this);
+  
+  --(*this);
+  
+  return temp;
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator==(const const_row_col_iterator& rhs) const
+{
+  return (rhs.current_pos == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator!=(const const_row_col_iterator& rhs) const
+{
+  return (rhs.current_pos != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator==(const row_col_iterator& rhs) const
+{
+  return (rhs.current_pos == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator!=(const row_col_iterator& rhs) const
+{
+  return (rhs.current_pos != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator==(const const_iterator& rhs) const
+{
+  return (rhs == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator!=(const const_iterator& rhs) const
+{
+  return (rhs != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator==(const iterator& rhs) const
+{
+  return (rhs == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator!=(const iterator& rhs) const
+{
+  return (rhs != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator==(const const_row_iterator& rhs) const
+{
+  return (&rhs.M(rhs.row, rhs.col) == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator!=(const const_row_iterator& rhs) const
+{
+  return (&rhs.M(rhs.row, rhs.col) != current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator==(const row_iterator& rhs) const
+{
+  return (&rhs.M(rhs.row, rhs.col) == current_pos);
+}
+
+template<typename eT>
+inline bool
+Mat<eT>::row_col_iterator::operator!=(const row_iterator& rhs) const
+{
+  return (&rhs.M(rhs.row, rhs.col) != current_pos);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+// extended Mat functionality implementation                                 //
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename eT>
+inline typename Mat<eT>::const_row_col_iterator
+Mat<eT>::begin_row_col() const
+{
+  return const_row_col_iterator(*this);
+}
+
+template<typename eT>
+inline typename Mat<eT>::row_col_iterator
+Mat<eT>::begin_row_col() 
+{
+  return row_col_iterator(*this);
+}
+
+template<typename eT>
+inline typename Mat<eT>::const_row_col_iterator
+Mat<eT>::end_row_col() const
+{
+  return ++const_row_col_iterator(*this, n_rows - 1, n_cols - 1);
+}
+
+template<typename eT>
+inline typename Mat<eT>::row_col_iterator
+Mat<eT>::end_row_col()
+{
+  return ++row_col_iterator(*this, n_rows - 1, n_cols - 1);
+}
diff --git a/src/mlpack/core/arma_extend/arma_extend.hpp b/src/mlpack/core/arma_extend/arma_extend.hpp
index 1765ee4..54f79f3 100644
--- a/src/mlpack/core/arma_extend/arma_extend.hpp
+++ b/src/mlpack/core/arma_extend/arma_extend.hpp
@@ -16,6 +16,10 @@
 #define ARMA_EXTRA_SPMAT_PROTO mlpack/core/arma_extend/SpMat_extra_bones.hpp
 #define ARMA_EXTRA_SPMAT_MEAT  mlpack/core/arma_extend/SpMat_extra_meat.hpp
 
+// add row_col_iterator and row_col_const_iterator for Mat
+#define ARMA_EXTRA_MAT_PROTO mlpack/core/arma_extend/Mat_extra_bones.hpp
+#define ARMA_EXTRA_MAT_MEAT mlpack/core/arma_extend/Mat_extra_meat.hpp
+
 #include <armadillo>
 
 namespace arma {



More information about the mlpack-git mailing list