diff armadillo-3.900.4/include/armadillo_bits/subview_field_meat.hpp @ 49:1ec0e2823891

Switch to using subrepo copies of qm-dsp, nnls-chroma, vamp-plugin-sdk; update Armadillo version; assume build without external BLAS/LAPACK
author Chris Cannam
date Thu, 13 Jun 2013 10:25:24 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/armadillo-3.900.4/include/armadillo_bits/subview_field_meat.hpp	Thu Jun 13 10:25:24 2013 +0100
@@ -0,0 +1,304 @@
+// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
+// Copyright (C) 2008-2012 Conrad Sanderson
+// 
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+//! \addtogroup subview_field
+//! @{
+
+
+template<typename oT>
+inline
+subview_field<oT>::~subview_field()
+  {
+  arma_extra_debug_sigprint();
+  }
+
+
+
+template<typename oT>
+arma_inline
+subview_field<oT>::subview_field
+  (
+  const field<oT>& in_f,
+  const uword      in_row1,
+  const uword      in_col1,
+  const uword      in_n_rows,
+  const uword      in_n_cols
+  )
+  : f(in_f)
+  , aux_row1(in_row1)
+  , aux_col1(in_col1)
+  , n_rows(in_n_rows)
+  , n_cols(in_n_cols)
+  , n_elem(in_n_rows*in_n_cols)
+  {
+  arma_extra_debug_sigprint();
+  }
+
+
+
+template<typename oT>
+inline
+void
+subview_field<oT>::operator= (const field<oT>& x)
+  {
+  arma_extra_debug_sigprint();
+  
+  subview_field<oT>& t = *this;
+  
+  arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols), "incompatible field dimensions");
+  
+  for(uword col=0; col<t.n_cols; ++col)
+    {
+    for(uword row=0; row<t.n_rows; ++row)
+      {
+      t.at(row,col) = x.at(row,col);
+      }
+    }
+  }
+
+
+
+//! x.subfield(...) = y.subfield(...)
+template<typename oT>
+inline
+void
+subview_field<oT>::operator= (const subview_field<oT>& x_in)
+  {
+  arma_extra_debug_sigprint();
+  
+  const bool overlap = check_overlap(x_in);
+        
+        field<oT>*         tmp_field   = overlap ? new field<oT>(x_in.f) : 0;
+  const subview_field<oT>* tmp_subview = overlap ? new subview_field<oT>(*tmp_field, x_in.aux_row1, x_in.aux_col1, x_in.n_rows, x_in.n_cols) : 0;
+  const subview_field<oT>& x           = overlap ? (*tmp_subview) : x_in;
+  
+  subview_field<oT>& t = *this;
+  
+  arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols), "incompatible field dimensions");
+  
+  for(uword col=0; col<t.n_cols; ++col)
+    {
+    for(uword row=0; row<t.n_rows; ++row)
+      {
+      t.at(row,col) = x.at(row,col);
+      }
+    }
+    
+  if(overlap)
+    {
+    delete tmp_subview;
+    delete tmp_field;
+    }
+  }
+
+
+
+template<typename oT>
+arma_inline
+oT&
+subview_field<oT>::operator[](const uword i)
+  {
+  const uword in_col = i / n_rows;
+  const uword in_row = i % n_rows;
+    
+  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
+  
+  return *((const_cast< field<oT>& >(f)).mem[index]);
+  }
+
+
+
+template<typename oT>
+arma_inline
+const oT&
+subview_field<oT>::operator[](const uword i) const
+  {
+  const uword in_col = i / n_rows;
+  const uword in_row = i % n_rows;
+  
+  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
+  
+  return *(f.mem[index]);
+  }
+
+
+
+template<typename oT>
+arma_inline
+oT&
+subview_field<oT>::operator()(const uword i)
+  {
+  arma_debug_check( (i >= n_elem), "subview_field::operator(): index out of bounds");
+  
+  const uword in_col = i / n_rows;
+  const uword in_row = i % n_rows;
+  
+  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
+  
+  return *((const_cast< field<oT>& >(f)).mem[index]);
+  }
+
+
+
+template<typename oT>
+arma_inline
+const oT&
+subview_field<oT>::operator()(const uword i) const
+  {
+  arma_debug_check( (i >= n_elem), "subview_field::operator(): index out of bounds");
+  
+  const uword in_col = i / n_rows;
+  const uword in_row = i % n_rows;
+  
+  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
+  
+  return *(f.mem[index]);
+  }
+
+
+
+template<typename oT>
+arma_inline
+oT&
+subview_field<oT>::operator()(const uword in_row, const uword in_col)
+  {
+  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview_field::operator(): index out of bounds");
+  
+  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
+  
+  return *((const_cast< field<oT>& >(f)).mem[index]);
+  }
+
+
+
+template<typename oT>
+arma_inline
+const oT&
+subview_field<oT>::operator()(const uword in_row, const uword in_col) const
+  {
+  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "subview_field::operator(): index out of bounds");
+  
+  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
+  
+  return *(f.mem[index]);
+  }
+
+
+
+template<typename oT>
+arma_inline
+oT&
+subview_field<oT>::at(const uword in_row, const uword in_col)
+  {
+  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
+  
+  return *((const_cast< field<oT>& >(f)).mem[index]);
+  }
+
+
+
+template<typename oT>
+arma_inline
+const oT&
+subview_field<oT>::at(const uword in_row, const uword in_col) const
+  {
+  //arma_extra_debug_sigprint();
+  
+  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;
+  
+  return *(f.mem[index]);
+  }
+
+
+
+template<typename oT>
+inline
+bool
+subview_field<oT>::check_overlap(const subview_field<oT>& x) const
+  {
+  const subview_field<oT>& t = *this;
+  
+  if(&t.f != &x.f)
+    {
+    return false;
+    }
+  else
+    {
+    if( (t.n_elem == 0) || (x.n_elem == 0) )
+      {
+      return false;
+      }
+    else
+      {
+      const uword t_row_start  = t.aux_row1;
+      const uword t_row_end_p1 = t_row_start + t.n_rows;
+      
+      const uword t_col_start  = t.aux_col1;
+      const uword t_col_end_p1 = t_col_start + t.n_cols;
+      
+      
+      const uword x_row_start  = x.aux_row1;
+      const uword x_row_end_p1 = x_row_start + x.n_rows;
+      
+      const uword x_col_start  = x.aux_col1;
+      const uword x_col_end_p1 = x_col_start + x.n_cols;
+      
+      
+      const bool outside_rows = ( (x_row_start >= t_row_end_p1) || (t_row_start >= x_row_end_p1) );
+      const bool outside_cols = ( (x_col_start >= t_col_end_p1) || (t_col_start >= x_col_end_p1) );
+      
+      return ( (outside_rows == false) && (outside_cols == false) );
+      }
+    }
+  }
+
+
+
+//! X = Y.subfield(...)
+template<typename oT>
+inline
+void
+subview_field<oT>::extract(field<oT>& actual_out, const subview_field<oT>& in)
+  {
+  arma_extra_debug_sigprint();
+  
+  //
+  const bool alias = (&actual_out == &in.f);
+  
+  field<oT>* tmp = (alias) ? new field<oT> : 0;
+  field<oT>& out = (alias) ? (*tmp)        : actual_out;
+  
+  //
+  
+  const uword n_rows = in.n_rows;
+  const uword n_cols = in.n_cols;
+  
+  out.set_size(n_rows, n_cols);
+  
+  arma_extra_debug_print(arma_boost::format("out.n_rows = %d   out.n_cols = %d    in.m.n_rows = %d  in.m.n_cols = %d") % out.n_rows % out.n_cols % in.f.n_rows % in.f.n_cols );
+  
+  for(uword col = 0; col<n_cols; ++col)
+    {
+    for(uword row = 0; row<n_rows; ++row)
+      {
+      out.at(row,col) = in.at(row,col);
+      }
+    }
+  
+  
+  if(alias)
+    {
+    actual_out = out;
+    delete tmp;
+    }
+  
+  }
+
+
+
+//! @}