[mlpack-svn] r16866 - mlpack/trunk/src/mlpack/core/arma_extend

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Fri Jul 25 17:24:04 EDT 2014


Author: rcurtin
Date: Fri Jul 25 17:24:04 2014
New Revision: 16866

Log:
Patch from sumedh: Mat::row_col_iterator


Added:
   mlpack/trunk/src/mlpack/core/arma_extend/Mat_extra_bones.hpp
   mlpack/trunk/src/mlpack/core/arma_extend/Mat_extra_meat.hpp
Modified:
   mlpack/trunk/src/mlpack/core/arma_extend/CMakeLists.txt
   mlpack/trunk/src/mlpack/core/arma_extend/arma_extend.hpp

Modified: mlpack/trunk/src/mlpack/core/arma_extend/CMakeLists.txt
==============================================================================
--- mlpack/trunk/src/mlpack/core/arma_extend/CMakeLists.txt	(original)
+++ mlpack/trunk/src/mlpack/core/arma_extend/CMakeLists.txt	Fri Jul 25 17:24:04 2014
@@ -14,6 +14,8 @@
   typedef.hpp
   SpMat_extra_bones.hpp
   SpMat_extra_meat.hpp
+  Mat_extra_bones.hpp
+  Mat_extra_meat.hpp
 )
 
 # add directory name to sources

Added: mlpack/trunk/src/mlpack/core/arma_extend/Mat_extra_bones.hpp
==============================================================================
--- (empty file)
+++ mlpack/trunk/src/mlpack/core/arma_extend/Mat_extra_bones.hpp	Fri Jul 25 17:24:04 2014
@@ -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();

Added: mlpack/trunk/src/mlpack/core/arma_extend/Mat_extra_meat.hpp
==============================================================================
--- (empty file)
+++ mlpack/trunk/src/mlpack/core/arma_extend/Mat_extra_meat.hpp	Fri Jul 25 17:24:04 2014
@@ -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);
+}

Modified: mlpack/trunk/src/mlpack/core/arma_extend/arma_extend.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/core/arma_extend/arma_extend.hpp	(original)
+++ mlpack/trunk/src/mlpack/core/arma_extend/arma_extend.hpp	Fri Jul 25 17:24:04 2014
@@ -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-svn mailing list