Mat_bones.hpp   Mat_bones.hpp 
// Copyright (C) 2008-2012 NICTA (www.nicta.com.au) // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
// Copyright (C) 2008-2012 Conrad Sanderson // Copyright (C) 2008-2013 Conrad Sanderson
// Copyright (C) 2012 Ryan Curtin // Copyright (C) 2012 Ryan Curtin
// //
// This file is part of the Armadillo C++ library. // This file is part of the Armadillo C++ library.
// It is provided without any warranty of fitness // It is provided without any warranty of fitness
// for any purpose. You can redistribute this file // for any purpose. You can redistribute this file
// and/or modify it under the terms of the GNU // and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published // Lesser General Public License (LGPL) as published
// by the Free Software Foundation, either version 3 // by the Free Software Foundation, either version 3
// of the License or (at your option) any later version. // of the License or (at your option) any later version.
// (see http://www.opensource.org/licenses for more info) // (see http://www.opensource.org/licenses for more info)
skipping to change at line 460 skipping to change at line 460
inline row_iterator begin_row(const uword row_num); inline row_iterator begin_row(const uword row_num);
inline const_row_iterator begin_row(const uword row_num) const; inline const_row_iterator begin_row(const uword row_num) const;
inline row_iterator end_row (const uword row_num); inline row_iterator end_row (const uword row_num);
inline const_row_iterator end_row (const uword row_num) const; inline const_row_iterator end_row (const uword row_num) const;
inline void clear(); inline void clear();
inline bool empty() const; inline bool empty() const;
inline uword size() const; inline uword size() const;
inline void swap(Mat& B);
inline void steal_mem(Mat& X); //!< don't use this unless you're writing code internal to Armadillo inline void steal_mem(Mat& X); //!< don't use this unless you're writing code internal to Armadillo
template<uword fixed_n_rows, uword fixed_n_cols> class fixed; template<uword fixed_n_rows, uword fixed_n_cols> class fixed;
protected: protected:
inline void init_cold(); inline void init_cold();
inline void init_warm(uword in_rows, uword in_cols); inline void init_warm(uword in_rows, uword in_cols);
inline void init(const std::string& text); inline void init(const std::string& text);
 End of changes. 2 change blocks. 
2 lines changed or deleted 4 lines changed or added


 Mat_meat.hpp   Mat_meat.hpp 
// Copyright (C) 2008-2012 NICTA (www.nicta.com.au) // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
// Copyright (C) 2008-2012 Conrad Sanderson // Copyright (C) 2008-2013 Conrad Sanderson
// Copyright (C) 2012 Ryan Curtin // Copyright (C) 2012 Ryan Curtin
// //
// This file is part of the Armadillo C++ library. // This file is part of the Armadillo C++ library.
// It is provided without any warranty of fitness // It is provided without any warranty of fitness
// for any purpose. You can redistribute this file // for any purpose. You can redistribute this file
// and/or modify it under the terms of the GNU // and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published // Lesser General Public License (LGPL) as published
// by the Free Software Foundation, either version 3 // by the Free Software Foundation, either version 3
// of the License or (at your option) any later version. // of the License or (at your option) any later version.
// (see http://www.opensource.org/licenses for more info) // (see http://www.opensource.org/licenses for more info)
skipping to change at line 662 skipping to change at line 662
{ {
for(uword ucol=0; ucol < local_n_cols; ++ucol) for(uword ucol=0; ucol < local_n_cols; ++ucol)
for(uword urow=0; urow < local_n_rows; ++urow) for(uword urow=0; urow < local_n_rows; ++urow)
{ {
*out_mem = std::complex<T>(PX.at(urow,ucol), PY.at(urow,ucol)); *out_mem = std::complex<T>(PX.at(urow,ucol), PY.at(urow,ucol));
out_mem++; out_mem++;
} }
} }
} }
//! EXPERIMENTAL: swap the contents of this matrix, denoted as matrix A, wi
th given matrix B
template<typename eT>
inline
void
Mat<eT>::swap(Mat<eT>& B)
{
Mat<eT>& A = (*this);
arma_extra_debug_sigprint(arma_boost::format("A = %x B = %x") % &A % &B
);
arma_debug_check( (A.vec_state != B.vec_state), "Mat::swap(): incompatibl
e object types" );
const uhword A_mem_state = A.mem_state;
const uhword B_mem_state = B.mem_state;
if( (A_mem_state == 0) && (B_mem_state == 0) )
{
const uword A_n_elem = A.n_elem;
const uword B_n_elem = B.n_elem;
const bool A_use_local_mem = (A_n_elem <= arma_config::mat_prealloc);
const bool B_use_local_mem = (B_n_elem <= arma_config::mat_prealloc);
if( (A_use_local_mem == false) && (B_use_local_mem == false) )
{
std::swap( access::rw(A.mem), access::rw(B.mem) );
}
else
if( (A_use_local_mem == true) && (B_use_local_mem == true) )
{
const uword N = (std::max)(A_n_elem, B_n_elem);
eT* A_mem = A.memptr();
eT* B_mem = B.memptr();
for(uword ii=0; ii < N; ++ii) { std::swap( A_mem[ii], B_mem[ii] ); }
}
else
if( (A_use_local_mem == true) && (B_use_local_mem == false) )
{
eT* A_mem_local = &(A.mem_local[0]);
eT* B_mem_local = &(B.mem_local[0]);
arrayops::copy(B_mem_local, A_mem_local, A_n_elem);
access::rw(A.mem) = B.mem;
access::rw(B.mem) = B_mem_local;
}
else
if( (A_use_local_mem == false) && (B_use_local_mem == true) )
{
eT* A_mem_local = &(A.mem_local[0]);
eT* B_mem_local = &(B.mem_local[0]);
arrayops::copy(A_mem_local, B_mem_local, B_n_elem);
access::rw(B.mem) = A.mem;
access::rw(A.mem) = A_mem_local;
}
std::swap( access::rw(A.n_rows), access::rw(B.n_rows) );
std::swap( access::rw(A.n_cols), access::rw(B.n_cols) );
std::swap( access::rw(A.n_elem), access::rw(B.n_elem) );
}
else
if( (A_mem_state == 3) && (B_mem_state == 3) )
{
arma_debug_check( ((A.n_rows != B.n_rows) || (A.n_cols != B.n_cols)), "
Mat::swap(): incompatible object types" );
const uword N = A.n_elem;
eT* A_mem = A.memptr();
eT* B_mem = B.memptr();
for(uword ii=0; ii < N; ++ii) { std::swap(A_mem[ii], B_mem[ii]); }
}
else
{
arma_bad("Mat::swap(): incompatible object types");
}
}
//! try to steal the memory from a given matrix; //! try to steal the memory from a given matrix;
//! if memory can't be stolen, copy the given matrix //! if memory can't be stolen, copy the given matrix
template<typename eT> template<typename eT>
inline inline
void void
Mat<eT>::steal_mem(Mat<eT>& x) Mat<eT>::steal_mem(Mat<eT>& x)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
if(this != &x) if(this != &x)
 End of changes. 2 change blocks. 
2 lines changed or deleted 88 lines changed or added


 SpMat_iterators_meat.hpp   SpMat_iterators_meat.hpp 
skipping to change at line 33 skipping to change at line 33
SpMat<eT>::iterator_base::iterator_base(const SpMat<eT>& in_M) SpMat<eT>::iterator_base::iterator_base(const SpMat<eT>& in_M)
: M(in_M) : M(in_M)
, internal_col(0) , internal_col(0)
, internal_pos(0) , internal_pos(0)
{ {
// Technically this iterator is invalid (it may not point to a real eleme nt) // Technically this iterator is invalid (it may not point to a real eleme nt)
} }
template<typename eT> template<typename eT>
inline inline
SpMat<eT>::iterator_base::iterator_base(const SpMat<eT>& in_M, const uword col, const uword pos) SpMat<eT>::iterator_base::iterator_base(const SpMat<eT>& in_M, const uword in_col, const uword in_pos)
: M(in_M) : M(in_M)
, internal_col(col) , internal_col(in_col)
, internal_pos(pos) , internal_pos(in_pos)
{ {
// Nothing to do. // Nothing to do.
} }
template<typename eT> template<typename eT>
inline inline
arma_hot arma_hot
eT eT
SpMat<eT>::iterator_base::operator*() const SpMat<eT>::iterator_base::operator*() const
{ {
 End of changes. 2 change blocks. 
3 lines changed or deleted 3 lines changed or added


 SpMat_meat.hpp   SpMat_meat.hpp 
skipping to change at line 579 skipping to change at line 579
SpMat<eT> z(n_rows, p.get_n_cols()); SpMat<eT> z(n_rows, p.get_n_cols());
z.mem_resize(nonzero_rows * p.get_n_cols()); // upper bound on size z.mem_resize(nonzero_rows * p.get_n_cols()); // upper bound on size
// Now we have to fill all the elements using a modification of the NUMBM M algorithm. // Now we have to fill all the elements using a modification of the NUMBM M algorithm.
uword cur_pos = 0; uword cur_pos = 0;
podarray<eT> partial_sums(n_rows); podarray<eT> partial_sums(n_rows);
partial_sums.zeros(); partial_sums.zeros();
for(uword col = 0; col < n_cols; ++col) for(uword lcol = 0; lcol < n_cols; ++lcol)
{ {
const_iterator it = begin(); const_iterator it = begin();
while(it != end()) while(it != end())
{ {
const eT value = (*it); const eT value = (*it);
partial_sums[it.row()] += (value * p.at(it.col(), col)); partial_sums[it.row()] += (value * p.at(it.col(), lcol));
++it; ++it;
} }
// Now add all partial sums to the matrix. // Now add all partial sums to the matrix.
for(uword i = 0; i < n_rows; ++i) for(uword i = 0; i < n_rows; ++i)
{ {
if(partial_sums[i] != eT(0)) if(partial_sums[i] != eT(0))
{ {
access::rw(z.values[cur_pos]) = partial_sums[i]; access::rw(z.values[cur_pos]) = partial_sums[i];
access::rw(z.row_indices[cur_pos]) = i; access::rw(z.row_indices[cur_pos]) = i;
++access::rw(z.col_ptrs[col + 1]); ++access::rw(z.col_ptrs[lcol + 1]);
//printf("colptr %d now %d\n", col + 1, z.col_ptrs[col + 1]); //printf("colptr %d now %d\n", lcol + 1, z.col_ptrs[lcol + 1]);
++cur_pos; ++cur_pos;
partial_sums[i] = 0; // Would it be faster to do this in batch late r? partial_sums[i] = 0; // Would it be faster to do this in batch late r?
} }
} }
} }
// Now fix the column pointers. // Now fix the column pointers.
for(uword c = 1; c <= z.n_cols; ++c) for(uword c = 1; c <= z.n_cols; ++c)
{ {
access::rw(z.col_ptrs[c]) += z.col_ptrs[c - 1]; access::rw(z.col_ptrs[c]) += z.col_ptrs[c - 1];
skipping to change at line 968 skipping to change at line 968
SpMat<eT>::operator+=(const subview<eT>& x) SpMat<eT>::operator+=(const subview<eT>& x)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "addition "); arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "addition ");
// Loop over every element. This could probably be written in a more // Loop over every element. This could probably be written in a more
// efficient way, by calculating the number of nonzero elements the outpu t // efficient way, by calculating the number of nonzero elements the outpu t
// matrix will have, allocating the memory correctly, and then filling th e // matrix will have, allocating the memory correctly, and then filling th e
// matrix correctly. However... for now, this works okay. // matrix correctly. However... for now, this works okay.
for(uword col = 0; col < n_cols; ++col) for(uword lcol = 0; lcol < n_cols; ++lcol)
for(uword lrow = 0; lrow < n_rows; ++lrow)
{ {
for(uword row = 0; row < n_rows; ++row) at(lrow, lcol) += x.at(lrow, lcol);
{
at(row, col) += x.at(row, col);
}
} }
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
const SpMat<eT>& const SpMat<eT>&
SpMat<eT>::operator-=(const subview<eT>& x) SpMat<eT>::operator-=(const subview<eT>& x)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "subtract ion"); arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "subtract ion");
// Loop over every element. // Loop over every element.
for(uword col = 0; col < n_cols; ++col) for(uword lcol = 0; lcol < n_cols; ++lcol)
for(uword lrow = 0; lrow < n_rows; ++lrow)
{ {
for(uword row = 0; row < n_rows; ++row) at(lrow, lcol) -= x.at(lrow, lcol);
{
at(row, col) -= x.at(row, col);
}
} }
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
const SpMat<eT>& const SpMat<eT>&
SpMat<eT>::operator*=(const subview<eT>& y) SpMat<eT>::operator*=(const subview<eT>& y)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_assert_mul_size(n_rows, n_cols, y.n_rows, y.n_cols, "matrix mu ltiplication"); arma_debug_assert_mul_size(n_rows, n_cols, y.n_rows, y.n_cols, "matrix mu ltiplication");
SpMat<eT> z(n_rows, y.n_cols); SpMat<eT> z(n_rows, y.n_cols);
// Performed in the same fashion as operator*=(SpMat). // Performed in the same fashion as operator*=(SpMat).
for (const_row_iterator x_row_it = begin_row(); x_row_it.pos() < n_nonzer o; ++x_row_it) for (const_row_iterator x_row_it = begin_row(); x_row_it.pos() < n_nonzer o; ++x_row_it)
{ {
for (uword col = 0; col < y.n_cols; ++col) for (uword lcol = 0; lcol < y.n_cols; ++lcol)
{ {
// At this moment in the loop, we are calculating anything that is co ntributed to by *x_row_it and *y_col_it. // At this moment in the loop, we are calculating anything that is co ntributed to by *x_row_it and *y_col_it.
// Given that our position is x_ab and y_bc, there will only be a con tribution if x.col == y.row, and that // Given that our position is x_ab and y_bc, there will only be a con tribution if x.col == y.row, and that
// contribution will be in location z_ac. // contribution will be in location z_ac.
z.at(x_row_it.row, col) += (*x_row_it) * y.at(x_row_it.col, col); z.at(x_row_it.row, lcol) += (*x_row_it) * y.at(x_row_it.col, lcol);
} }
} }
steal_mem(z); steal_mem(z);
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
const SpMat<eT>& const SpMat<eT>&
SpMat<eT>::operator%=(const subview<eT>& x) SpMat<eT>::operator%=(const subview<eT>& x)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "element- wise multiplication"); arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "element- wise multiplication");
// Loop over every element. // Loop over every element.
for(uword col = 0; col < n_cols; ++col) for(uword lcol = 0; lcol < n_cols; ++lcol)
for(uword lrow = 0; lrow < n_rows; ++lrow)
{ {
for(uword row = 0; row < n_rows; ++row) at(lrow, lcol) *= x.at(lrow, lcol);
{
at(row, col) *= x.at(row, col);
}
} }
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
const SpMat<eT>& const SpMat<eT>&
SpMat<eT>::operator/=(const subview<eT>& x) SpMat<eT>::operator/=(const subview<eT>& x)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "element- wise division"); arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "element- wise division");
// Loop over every element. // Loop over every element.
for(uword col = 0; col < n_cols; ++col) for(uword lcol = 0; lcol < n_cols; ++lcol)
for(uword lrow = 0; lrow < n_rows; ++lrow)
{ {
for(uword row = 0; row < n_rows; ++row) at(lrow, lcol) /= x.at(lrow, lcol);
{
at(row, col) /= x.at(row, col);
}
} }
return *this; return *this;
} }
template<typename eT> template<typename eT>
template<typename T1, typename spop_type> template<typename T1, typename spop_type>
inline inline
SpMat<eT>::SpMat(const SpOp<T1, spop_type>& X) SpMat<eT>::SpMat(const SpOp<T1, spop_type>& X)
: n_rows(0) : n_rows(0)
skipping to change at line 1570 skipping to change at line 1562
{ {
return; return;
} }
// The easier way to do this, instead of collecting all the elements in o ne row and then swapping with the other, will be // The easier way to do this, instead of collecting all the elements in o ne row and then swapping with the other, will be
// to iterate over each column of the matrix (since we store in column-ma jor format) and then swap the two elements in the two rows at that time. // to iterate over each column of the matrix (since we store in column-ma jor format) and then swap the two elements in the two rows at that time.
// We will try to avoid using the at() call since it is expensive, instea d preferring to use an iterator to track our position. // We will try to avoid using the at() call since it is expensive, instea d preferring to use an iterator to track our position.
uword col1 = (in_row1 < in_row2) ? in_row1 : in_row2; uword col1 = (in_row1 < in_row2) ? in_row1 : in_row2;
uword col2 = (in_row1 < in_row2) ? in_row2 : in_row1; uword col2 = (in_row1 < in_row2) ? in_row2 : in_row1;
for (uword col = 0; col < n_cols; col++) for (uword lcol = 0; lcol < n_cols; lcol++)
{ {
// If there is nothing in this column we can ignore it. // If there is nothing in this column we can ignore it.
if (col_ptrs[col] == col_ptrs[col + 1]) if (col_ptrs[lcol] == col_ptrs[lcol + 1])
{ {
continue; continue;
} }
// These will represent the positions of the items themselves. // These will represent the positions of the items themselves.
uword loc1 = n_nonzero + 1; uword loc1 = n_nonzero + 1;
uword loc2 = n_nonzero + 1; uword loc2 = n_nonzero + 1;
for (uword search_pos = col_ptrs[col]; search_pos < col_ptrs[col + 1]; search_pos++) for (uword search_pos = col_ptrs[lcol]; search_pos < col_ptrs[lcol + 1] ; search_pos++)
{ {
if (row_indices[search_pos] == col1) if (row_indices[search_pos] == col1)
{ {
loc1 = search_pos; loc1 = search_pos;
} }
if (row_indices[search_pos] == col2) if (row_indices[search_pos] == col2)
{ {
loc2 = search_pos; loc2 = search_pos;
break; // No need to look any further. break; // No need to look any further.
skipping to change at line 1609 skipping to change at line 1601
{ {
// This is an easy case: just swap the values. No index modifying ne cessary. // This is an easy case: just swap the values. No index modifying ne cessary.
eT tmp = values[loc1]; eT tmp = values[loc1];
access::rw(values[loc1]) = values[loc2]; access::rw(values[loc1]) = values[loc2];
access::rw(values[loc2]) = tmp; access::rw(values[loc2]) = tmp;
} }
else if (loc1 != (n_nonzero + 1)) // We only found loc1 and not loc2. else if (loc1 != (n_nonzero + 1)) // We only found loc1 and not loc2.
{ {
// We need to find the correct place to move our value to. It will b e forward (not backwards) because in_row2 > in_row1. // We need to find the correct place to move our value to. It will b e forward (not backwards) because in_row2 > in_row1.
// Each iteration of the loop swaps the current value (loc1) with (lo c1 + 1); in this manner we move our value down to where it should be. // Each iteration of the loop swaps the current value (loc1) with (lo c1 + 1); in this manner we move our value down to where it should be.
while (((loc1 + 1) < col_ptrs[col + 1]) && (row_indices[loc1 + 1] < i n_row2)) while (((loc1 + 1) < col_ptrs[lcol + 1]) && (row_indices[loc1 + 1] < in_row2))
{ {
// Swap both the values and the indices. The column should not cha nge. // Swap both the values and the indices. The column should not cha nge.
eT tmp = values[loc1]; eT tmp = values[loc1];
access::rw(values[loc1]) = values[loc1 + 1]; access::rw(values[loc1]) = values[loc1 + 1];
access::rw(values[loc1 + 1]) = tmp; access::rw(values[loc1 + 1]) = tmp;
uword tmp_index = row_indices[loc1]; uword tmp_index = row_indices[loc1];
access::rw(row_indices[loc1]) = row_indices[loc1 + 1]; access::rw(row_indices[loc1]) = row_indices[loc1 + 1];
access::rw(row_indices[loc1 + 1]) = tmp_index; access::rw(row_indices[loc1 + 1]) = tmp_index;
skipping to change at line 1631 skipping to change at line 1623
} }
// Now set the row index correctly. // Now set the row index correctly.
access::rw(row_indices[loc1]) = in_row2; access::rw(row_indices[loc1]) = in_row2;
} }
else if (loc2 != (n_nonzero + 1)) else if (loc2 != (n_nonzero + 1))
{ {
// We need to find the correct place to move our value to. It will b e backwards (not forwards) because in_row1 < in_row2. // We need to find the correct place to move our value to. It will b e backwards (not forwards) because in_row1 < in_row2.
// Each iteration of the loop swaps the current value (loc2) with (lo c2 - 1); in this manner we move our value up to where it should be. // Each iteration of the loop swaps the current value (loc2) with (lo c2 - 1); in this manner we move our value up to where it should be.
while (((loc2 - 1) >= col_ptrs[col]) && (row_indices[loc2 - 1] > in_r ow1)) while (((loc2 - 1) >= col_ptrs[lcol]) && (row_indices[loc2 - 1] > in_ row1))
{ {
// Swap both the values and the indices. The column should not cha nge. // Swap both the values and the indices. The column should not cha nge.
eT tmp = values[loc2]; eT tmp = values[loc2];
access::rw(values[loc2]) = values[loc2 - 1]; access::rw(values[loc2]) = values[loc2 - 1];
access::rw(values[loc2 - 1]) = tmp; access::rw(values[loc2 - 1]) = tmp;
uword tmp_index = row_indices[loc2]; uword tmp_index = row_indices[loc2];
access::rw(row_indices[loc2]) = row_indices[loc2 - 1]; access::rw(row_indices[loc2]) = row_indices[loc2 - 1];
access::rw(row_indices[loc2 - 1]) = tmp_index; access::rw(row_indices[loc2 - 1]) = tmp_index;
skipping to change at line 1664 skipping to change at line 1656
* Swap in_col1 with in_col2. * Swap in_col1 with in_col2.
*/ */
template<typename eT> template<typename eT>
inline inline
void void
SpMat<eT>::swap_cols(const uword in_col1, const uword in_col2) SpMat<eT>::swap_cols(const uword in_col1, const uword in_col2)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
// slow but works // slow but works
for(uword row = 0; row < n_rows; ++row) for(uword lrow = 0; lrow < n_rows; ++lrow)
{ {
eT tmp = at(row, in_col1); eT tmp = at(lrow, in_col1);
at(row, in_col1) = at(row, in_col2); at(lrow, in_col1) = at(lrow, in_col2);
at(row, in_col2) = tmp; at(lrow, in_col2) = tmp;
} }
} }
/** /**
* Remove the row row_num. * Remove the row row_num.
*/ */
template<typename eT> template<typename eT>
inline inline
void void
SpMat<eT>::shed_row(const uword row_num) SpMat<eT>::shed_row(const uword row_num)
skipping to change at line 1726 skipping to change at line 1718
uword i, j; uword i, j;
// Store the length of values // Store the length of values
uword vlength = n_nonzero; uword vlength = n_nonzero;
// Store the length of col_ptrs // Store the length of col_ptrs
uword clength = n_cols + 1; uword clength = n_cols + 1;
// This is O(n * n_cols) and inplace, there may be a faster way, though. // This is O(n * n_cols) and inplace, there may be a faster way, though.
for (i = 0, j = 0; i < vlength; ++i) for (i = 0, j = 0; i < vlength; ++i)
{ {
// Store the row of the ith element. // Store the row of the ith element.
const uword row = row_indices[i]; const uword lrow = row_indices[i];
// Is the ith element in the range of rows we want to remove? // Is the ith element in the range of rows we want to remove?
if (row >= in_row1 && row <= in_row2) if (lrow >= in_row1 && lrow <= in_row2)
{ {
// Increment our "removed elements" counter. // Increment our "removed elements" counter.
++j; ++j;
// Adjust the values of col_ptrs each time we remove an element. // Adjust the values of col_ptrs each time we remove an element.
// Basically, the length of one column reduces by one, and everything to // Basically, the length of one column reduces by one, and everything to
// its right gets reduced by one to represent all the elements being // its right gets reduced by one to represent all the elements being
// shifted to the left by one. // shifted to the left by one.
for(uword k = 0; k < clength; ++k) for(uword k = 0; k < clength; ++k)
{ {
skipping to change at line 1752 skipping to change at line 1744
} }
} }
} }
else else
{ {
// We shift the element we checked to the left by how many elements // We shift the element we checked to the left by how many elements
// we have removed. // we have removed.
// j = 0 until we remove the first element. // j = 0 until we remove the first element.
if (j != 0) if (j != 0)
{ {
access::rw(row_indices[i - j]) = (row > in_row2) ? (row - (in_row2 - in_row1 + 1)) : row; access::rw(row_indices[i - j]) = (lrow > in_row2) ? (lrow - (in_row 2 - in_row1 + 1)) : lrow;
access::rw(values[i - j]) = values[i]; access::rw(values[i - j]) = values[i];
} }
} }
} }
// j is the number of elements removed. // j is the number of elements removed.
// Shrink the vectors. This will copy the memory. // Shrink the vectors. This will copy the memory.
mem_resize(n_nonzero - j); mem_resize(n_nonzero - j);
skipping to change at line 2758 skipping to change at line 2750
// paranoia, but better be safe than sorry // paranoia, but better be safe than sorry
if( (index_left < index_new) && (index_new < index_right) ) if( (index_left < index_new) && (index_new < index_right) )
{ {
indices[i] = index_new; indices[i] = index_new;
} }
} }
uword cur_index = 0; uword cur_index = 0;
uword count = 0; uword count = 0;
for(uword col = 0; col < in_cols; ++col) for(uword lcol = 0; lcol < in_cols; ++lcol)
for(uword row = 0; row < in_rows; ++row) for(uword lrow = 0; lrow < in_rows; ++lrow)
{ {
if(count == indices[cur_index]) if(count == indices[cur_index])
{ {
access::rw(row_indices[cur_index]) = row; access::rw(row_indices[cur_index]) = lrow;
access::rw(col_ptrs[col + 1])++; access::rw(col_ptrs[lcol + 1])++;
++cur_index; ++cur_index;
} }
++count; ++count;
} }
if(cur_index != n_nonzero) if(cur_index != n_nonzero)
{ {
// Fix size to correct size. // Fix size to correct size.
mem_resize(cur_index); mem_resize(cur_index);
} }
// Sum column pointers. // Sum column pointers.
for(uword col = 1; col <= in_cols; ++col) for(uword lcol = 1; lcol <= in_cols; ++lcol)
{ {
access::rw(col_ptrs[col]) += col_ptrs[col - 1]; access::rw(col_ptrs[lcol]) += col_ptrs[lcol - 1];
} }
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
const SpMat<eT>& const SpMat<eT>&
SpMat<eT>::sprandn(const uword in_rows, const uword in_cols, const double d ensity) SpMat<eT>::sprandn(const uword in_rows, const uword in_cols, const double d ensity)
{ {
skipping to change at line 2833 skipping to change at line 2825
// paranoia, but better be safe than sorry // paranoia, but better be safe than sorry
if( (index_left < index_new) && (index_new < index_right) ) if( (index_left < index_new) && (index_new < index_right) )
{ {
indices[i] = index_new; indices[i] = index_new;
} }
} }
uword cur_index = 0; uword cur_index = 0;
uword count = 0; uword count = 0;
for(uword col = 0; col < in_cols; ++col) for(uword lcol = 0; lcol < in_cols; ++lcol)
for(uword row = 0; row < in_rows; ++row) for(uword lrow = 0; lrow < in_rows; ++lrow)
{ {
if(count == indices[cur_index]) if(count == indices[cur_index])
{ {
access::rw(row_indices[cur_index]) = row; access::rw(row_indices[cur_index]) = lrow;
access::rw(col_ptrs[col + 1])++; access::rw(col_ptrs[lcol + 1])++;
++cur_index; ++cur_index;
} }
++count; ++count;
} }
if(cur_index != n_nonzero) if(cur_index != n_nonzero)
{ {
// Fix size to correct size. // Fix size to correct size.
mem_resize(cur_index); mem_resize(cur_index);
} }
// Sum column pointers. // Sum column pointers.
for(uword col = 1; col <= in_cols; ++col) for(uword lcol = 1; lcol <= in_cols; ++lcol)
{ {
access::rw(col_ptrs[col]) += col_ptrs[col - 1]; access::rw(col_ptrs[lcol]) += col_ptrs[lcol - 1];
} }
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
void void
SpMat<eT>::reset() SpMat<eT>::reset()
{ {
skipping to change at line 3474 skipping to change at line 3466
line_start = line_end + 1; line_start = line_end + 1;
} }
set_size(t_n_rows, t_n_cols); set_size(t_n_rows, t_n_cols);
// Second time through will pick up all the values. // Second time through will pick up all the values.
line_start = 0; line_start = 0;
line_end = 0; line_end = 0;
uword row = 0; uword lrow = 0;
while (line_start < text.length()) while (line_start < text.length())
{ {
line_end = text.find(';', line_start); line_end = text.find(';', line_start);
if (line_end == std::string::npos) if (line_end == std::string::npos)
line_end = text.length() - 1; line_end = text.length() - 1;
std::string::size_type line_len = line_end - line_start + 1; std::string::size_type line_len = line_end - line_start + 1;
std::stringstream line_stream(text.substr(line_start, line_len)); std::stringstream line_stream(text.substr(line_start, line_len));
uword col = 0; uword lcol = 0;
eT val; eT val;
while (line_stream >> val) while (line_stream >> val)
{ {
// Only add nonzero elements. // Only add nonzero elements.
if (val != eT(0)) if (val != eT(0))
{ {
get_value(row, col) = val; get_value(lrow, lcol) = val;
} }
++col; ++lcol;
} }
++row; ++lrow;
line_start = line_end + 1; line_start = line_end + 1;
} }
} }
/** /**
* Copy from another matrix. * Copy from another matrix.
*/ */
template<typename eT> template<typename eT>
skipping to change at line 3576 skipping to change at line 3568
const uword n_alloc = memory::enlarge_to_mult_of_chunksize(n_nonzero) ; const uword n_alloc = memory::enlarge_to_mult_of_chunksize(n_nonzero) ;
if(n_alloc < new_n_nonzero) if(n_alloc < new_n_nonzero)
{ {
eT* new_values = memory::acquire_chunked<eT> (new_n_nonze ro + 1); eT* new_values = memory::acquire_chunked<eT> (new_n_nonze ro + 1);
uword* new_row_indices = memory::acquire_chunked<uword>(new_n_nonze ro + 1); uword* new_row_indices = memory::acquire_chunked<uword>(new_n_nonze ro + 1);
if(n_nonzero > 0) if(n_nonzero > 0)
{ {
// Copy old elements. // Copy old elements.
uword copy_size = std::min(n_nonzero, new_n_nonzero); uword copy_len = std::min(n_nonzero, new_n_nonzero);
arrayops::copy(new_values, values, copy_size); arrayops::copy(new_values, values, copy_len);
arrayops::copy(new_row_indices, row_indices, copy_size); arrayops::copy(new_row_indices, row_indices, copy_len);
} }
memory::release(values); memory::release(values);
memory::release(row_indices); memory::release(row_indices);
access::rw(values) = new_values; access::rw(values) = new_values;
access::rw(row_indices) = new_row_indices; access::rw(row_indices) = new_row_indices;
} }
// Set the "fake end" of the matrix by setting the last value and row // Set the "fake end" of the matrix by setting the last value and row
skipping to change at line 3908 skipping to change at line 3900
} }
template<typename eT> template<typename eT>
inline inline
arma_hot arma_hot
arma_warn_unused arma_warn_unused
SpValProxy<SpMat<eT> > SpValProxy<SpMat<eT> >
SpMat<eT>::get_value(const uword i) SpMat<eT>::get_value(const uword i)
{ {
// First convert to the actual location. // First convert to the actual location.
uword col = i / n_rows; // Integer division. uword lcol = i / n_rows; // Integer division.
uword row = i % n_rows; uword lrow = i % n_rows;
return get_value(row, col); return get_value(lrow, lcol);
} }
template<typename eT> template<typename eT>
inline inline
arma_hot arma_hot
arma_warn_unused arma_warn_unused
eT eT
SpMat<eT>::get_value(const uword i) const SpMat<eT>::get_value(const uword i) const
{ {
// First convert to the actual location. // First convert to the actual location.
uword col = i / n_rows; // Integer division. uword lcol = i / n_rows; // Integer division.
uword row = i % n_rows; uword lrow = i % n_rows;
return get_value(row, col); return get_value(lrow, lcol);
} }
template<typename eT> template<typename eT>
inline inline
arma_hot arma_hot
arma_warn_unused arma_warn_unused
SpValProxy<SpMat<eT> > SpValProxy<SpMat<eT> >
SpMat<eT>::get_value(const uword in_row, const uword in_col) SpMat<eT>::get_value(const uword in_row, const uword in_col)
{ {
const uword colptr = col_ptrs[in_col]; const uword colptr = col_ptrs[in_col];
skipping to change at line 4004 skipping to change at line 3996
* Given the index representing which of the nonzero values this is, return its * Given the index representing which of the nonzero values this is, return its
* actual location, either in row/col or just the index. * actual location, either in row/col or just the index.
*/ */
template<typename eT> template<typename eT>
arma_hot arma_hot
arma_inline arma_inline
arma_warn_unused arma_warn_unused
uword uword
SpMat<eT>::get_position(const uword i) const SpMat<eT>::get_position(const uword i) const
{ {
uword row, col; uword lrow, lcol;
get_position(i, row, col); get_position(i, lrow, lcol);
// Assemble the row/col into the element's location in the matrix. // Assemble the row/col into the element's location in the matrix.
return (row + n_rows * col); return (lrow + n_rows * lcol);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
arma_inline arma_inline
void void
SpMat<eT>::get_position(const uword i, uword& row_of_i, uword& col_of_i) co nst SpMat<eT>::get_position(const uword i, uword& row_of_i, uword& col_of_i) co nst
{ {
arma_debug_check((i >= n_nonzero), "SpMat::get_position(): index out of b ounds"); arma_debug_check((i >= n_nonzero), "SpMat::get_position(): index out of b ounds");
 End of changes. 45 change blocks. 
67 lines changed or deleted 59 lines changed or added


 SpSubview_bones.hpp   SpSubview_bones.hpp 
skipping to change at line 237 skipping to change at line 237
inline bool operator!=(const typename SpMat<eT>::const_row_iterator& rh s) const; inline bool operator!=(const typename SpMat<eT>::const_row_iterator& rh s) const;
inline bool operator==(const typename SpMat<eT>::const_row_iterator& rh s) const; inline bool operator==(const typename SpMat<eT>::const_row_iterator& rh s) const;
}; };
class iterator : public const_iterator class iterator : public const_iterator
{ {
public: public:
inline iterator(SpSubview& in_M, const uword initial_pos = 0) : const_i terator(in_M, initial_pos) { } inline iterator(SpSubview& in_M, const uword initial_pos = 0) : const_i terator(in_M, initial_pos) { }
inline iterator(SpSubview& in_M, const uword in_row, const uword in_col ) : const_iterator(in_M, in_row, in_col) { } inline iterator(SpSubview& in_M, const uword in_row, const uword in_col ) : const_iterator(in_M, in_row, in_col) { }
inline iterator(SpSubview& in_M, const uword in_row, const uword in_col , const uword in_pos, const uword skip_pos) : const_iterator(in_M, in_row, in_col, in_pos, skip_pos) { } inline iterator(SpSubview& in_M, const uword in_row, const uword in_col , const uword in_pos, const uword in_skip_pos) : const_iterator(in_M, in_ro w, in_col, in_pos, in_skip_pos) { }
inline iterator(const iterator& other) : const_iterator(other) { } inline iterator(const iterator& other) : const_iterator(other) { }
inline SpValProxy<SpSubview<eT> > operator*(); inline SpValProxy<SpSubview<eT> > operator*();
// overloads needed for return type correctness // overloads needed for return type correctness
inline iterator& operator++(); inline iterator& operator++();
inline iterator operator++(int); inline iterator operator++(int);
inline iterator& operator--(); inline iterator& operator--();
inline iterator operator--(int); inline iterator operator--(int);
 End of changes. 1 change blocks. 
1 lines changed or deleted 1 lines changed or added


 SpSubview_iterators_meat.hpp   SpSubview_iterators_meat.hpp 
skipping to change at line 33 skipping to change at line 33
: M(in_M) : M(in_M)
, internal_col(0) , internal_col(0)
, internal_pos(0) , internal_pos(0)
, skip_pos(0) , skip_pos(0)
{ {
// Technically this iterator is invalid (it may not point to a real eleme nt). // Technically this iterator is invalid (it may not point to a real eleme nt).
} }
template<typename eT> template<typename eT>
inline inline
SpSubview<eT>::iterator_base::iterator_base(const SpSubview<eT>& in_M, cons t uword col, const uword pos, const uword skip_pos) SpSubview<eT>::iterator_base::iterator_base(const SpSubview<eT>& in_M, cons t uword in_col, const uword in_pos, const uword in_skip_pos)
: M(in_M) : M(in_M)
, internal_col(col) , internal_col(in_col)
, internal_pos(pos) , internal_pos(in_pos)
, skip_pos(skip_pos) , skip_pos (in_skip_pos)
{ {
// Nothing to do. // Nothing to do.
} }
template<typename eT> template<typename eT>
inline inline
eT eT
SpSubview<eT>::iterator_base::operator*() const SpSubview<eT>::iterator_base::operator*() const
{ {
return M.m.values[internal_pos + skip_pos]; return M.m.values[internal_pos + skip_pos];
skipping to change at line 63 skipping to change at line 63
template<typename eT> template<typename eT>
inline inline
SpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, co nst uword initial_pos) SpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, co nst uword initial_pos)
: iterator_base(in_M, 0, initial_pos, 0) : iterator_base(in_M, 0, initial_pos, 0)
{ {
// Corner case for empty subviews. // Corner case for empty subviews.
if(in_M.n_nonzero == 0) if(in_M.n_nonzero == 0)
{ {
iterator_base::internal_col = in_M.n_cols; iterator_base::internal_col = in_M.n_cols;
iterator_base::skip_pos = in_M.m.n_nonzero; iterator_base::skip_pos = in_M.m.n_nonzero;
return; return;
} }
// Figure out the row and column of the position. // Figure out the row and column of the position.
// skip_pos holds the number of values which aren't part of this subview. // lskip_pos holds the number of values which aren't part of this subview .
const uword aux_col = iterator_base::M.aux_col1; const uword aux_col = iterator_base::M.aux_col1;
const uword aux_row = iterator_base::M.aux_row1; const uword aux_row = iterator_base::M.aux_row1;
const uword n_rows = iterator_base::M.n_rows; const uword ln_rows = iterator_base::M.n_rows;
const uword n_cols = iterator_base::M.n_cols; const uword ln_cols = iterator_base::M.n_cols;
uword cur_pos = 0; // off by one because we might be searching for pos 0 uword cur_pos = 0; // off by one because we might be searching for pos
uword skip_pos = iterator_base::M.m.col_ptrs[aux_col]; 0
uword cur_col = 0; uword lskip_pos = iterator_base::M.m.col_ptrs[aux_col];
uword cur_col = 0;
while(cur_pos < (iterator_base::internal_pos + 1)) while(cur_pos < (iterator_base::internal_pos + 1))
{ {
// Have we stepped forward a column (or multiple columns)? // Have we stepped forward a column (or multiple columns)?
while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + au x_col + 1]) && (cur_col < n_cols)) while(((lskip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + a ux_col + 1]) && (cur_col < ln_cols))
{ {
++cur_col; ++cur_col;
} }
// See if the current position is in the subview. // See if the current position is in the subview.
const uword row_index = iterator_base::M.m.row_indices[cur_pos + skip_p os]; const uword row_index = iterator_base::M.m.row_indices[cur_pos + lskip_ pos];
if(row_index < aux_row) if(row_index < aux_row)
{ {
++skip_pos; // not valid ++lskip_pos; // not valid
} }
else if(row_index < (aux_row + n_rows)) else if(row_index < (aux_row + ln_rows))
{ {
++cur_pos; // valid, in the subview ++cur_pos; // valid, in the subview
} }
else else
{ {
// skip to end of column // skip to end of column
const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_c ol + 1]; const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_c ol + 1];
skip_pos += (next_colptr - (cur_pos + skip_pos)); lskip_pos += (next_colptr - (cur_pos + lskip_pos));
} }
} }
iterator_base::internal_col = cur_col; iterator_base::internal_col = cur_col;
iterator_base::skip_pos = skip_pos; iterator_base::skip_pos = lskip_pos;
} }
template<typename eT> template<typename eT>
inline inline
SpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, co nst uword in_row, const uword in_col) SpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, co nst uword in_row, const uword in_col)
: iterator_base(in_M, in_col, 0, 0) : iterator_base(in_M, in_col, 0, 0)
{ {
// Corner case for empty subviews. // Corner case for empty subviews.
if(in_M.n_nonzero == 0) if(in_M.n_nonzero == 0)
{ {
// We must be at the last position. // We must be at the last position.
iterator_base::internal_col = in_M.n_cols; iterator_base::internal_col = in_M.n_cols;
iterator_base::skip_pos = in_M.m.n_nonzero; iterator_base::skip_pos = in_M.m.n_nonzero;
return; return;
} }
// We have a destination we want to be just after, but don't know what po sition that is. // We have a destination we want to be just after, but don't know what po sition that is.
// Because we have to count the points in this subview and not in this su bview, this becomes a little difficult and slow. // Because we have to count the points in this subview and not in this su bview, this becomes a little difficult and slow.
const uword aux_col = iterator_base::M.aux_col1; const uword aux_col = iterator_base::M.aux_col1;
const uword aux_row = iterator_base::M.aux_row1; const uword aux_row = iterator_base::M.aux_row1;
const uword n_rows = iterator_base::M.n_rows; const uword ln_rows = iterator_base::M.n_rows;
const uword n_cols = iterator_base::M.n_cols; const uword ln_cols = iterator_base::M.n_cols;
uword cur_pos = 0; uword cur_pos = 0;
uword skip_pos = iterator_base::M.m.col_ptrs[aux_col]; uword skip_pos = iterator_base::M.m.col_ptrs[aux_col];
uword cur_col = 0; uword cur_col = 0;
while(cur_col < in_col) while(cur_col < in_col)
{ {
// See if the current position is in the subview. // See if the current position is in the subview.
const uword row_index = iterator_base::M.m.row_indices[cur_pos + skip_p os]; const uword row_index = iterator_base::M.m.row_indices[cur_pos + skip_p os];
if(row_index < aux_row) if(row_index < aux_row)
{ {
++skip_pos; ++skip_pos;
} }
else if(row_index < (aux_row + n_rows)) else if(row_index < (aux_row + ln_rows))
{ {
++cur_pos; ++cur_pos;
} }
else else
{ {
// skip to end of column // skip to end of column
const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_c ol + 1]; const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_c ol + 1];
skip_pos += (next_colptr - (cur_pos + skip_pos)); skip_pos += (next_colptr - (cur_pos + skip_pos));
} }
// Have we stepped forward a column (or multiple columns)? // Have we stepped forward a column (or multiple columns)?
while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + au x_col + 1]) && (cur_col < n_cols)) while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + au x_col + 1]) && (cur_col < ln_cols))
{ {
++cur_col; ++cur_col;
} }
} }
// Now we are either on the right column or ahead of it. // Now we are either on the right column or ahead of it.
if(cur_col == in_col) if(cur_col == in_col)
{ {
// We have to find the right row index. // We have to find the right row index.
uword row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos]; uword row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos];
skipping to change at line 176 skipping to change at line 176
if(row_index < aux_row) if(row_index < aux_row)
{ {
++skip_pos; ++skip_pos;
} }
else else
{ {
++cur_pos; ++cur_pos;
} }
// Ensure we didn't step forward a column; if we did, we need to stop . // Ensure we didn't step forward a column; if we did, we need to stop .
while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < n_cols)) while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols))
{ {
++cur_col; ++cur_col;
} }
if(cur_col != in_col) if(cur_col != in_col)
{ {
break; break;
} }
row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos]; row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos];
skipping to change at line 198 skipping to change at line 198
} }
// Now we need to find the next valid position in the subview. // Now we need to find the next valid position in the subview.
uword row_index; uword row_index;
while(true) while(true)
{ {
const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]; const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];
row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos]; row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos];
// Are we at the last position? // Are we at the last position?
if(cur_col >= n_cols) if(cur_col >= ln_cols)
{ {
cur_col = n_cols; cur_col = ln_cols;
// Make sure we will be pointing at the last element in the parent ma trix. // Make sure we will be pointing at the last element in the parent ma trix.
skip_pos = iterator_base::M.m.n_nonzero - iterator_base::M.n_nonzero; skip_pos = iterator_base::M.m.n_nonzero - iterator_base::M.n_nonzero;
break; break;
} }
if(row_index < aux_row) if(row_index < aux_row)
{ {
++skip_pos; ++skip_pos;
} }
else if(row_index < (aux_row + n_rows)) else if(row_index < (aux_row + ln_rows))
{ {
break; // found break; // found
} }
else else
{ {
skip_pos += (next_colptr - (cur_pos + skip_pos)); skip_pos += (next_colptr - (cur_pos + skip_pos));
} }
// Did we move any columns? // Did we move any columns?
while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + au x_col + 1]) && (cur_col < n_cols)) while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + au x_col + 1]) && (cur_col < ln_cols))
{ {
++cur_col; ++cur_col;
} }
} }
// It is possible we have moved another column. // It is possible we have moved another column.
while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_ col + 1]) && (cur_col < n_cols)) while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_ col + 1]) && (cur_col < ln_cols))
{ {
++cur_col; ++cur_col;
} }
iterator_base::internal_pos = cur_pos; iterator_base::internal_pos = cur_pos;
iterator_base::skip_pos = skip_pos; iterator_base::skip_pos = skip_pos;
iterator_base::internal_col = cur_col; iterator_base::internal_col = cur_col;
} }
template<typename eT> template<typename eT>
inline inline
SpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, uw SpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, uw
ord in_row, uword in_col, uword in_pos, uword skip_pos) ord in_row, uword in_col, uword in_pos, uword in_skip_pos)
: iterator_base(in_M, in_col, in_pos, skip_pos) : iterator_base(in_M, in_col, in_pos, in_skip_pos)
{ {
// Nothing to do. // Nothing to do.
} }
template<typename eT> template<typename eT>
inline inline
SpSubview<eT>::const_iterator::const_iterator(const const_iterator& other) SpSubview<eT>::const_iterator::const_iterator(const const_iterator& other)
: iterator_base(other.M, other.internal_col, other.internal_pos, other.sk ip_pos) : iterator_base(other.M, other.internal_col, other.internal_pos, other.sk ip_pos)
{ {
// Nothing to do. // Nothing to do.
} }
template<typename eT> template<typename eT>
inline inline
typename SpSubview<eT>::const_iterator& typename SpSubview<eT>::const_iterator&
SpSubview<eT>::const_iterator::operator++() SpSubview<eT>::const_iterator::operator++()
{ {
const uword aux_col = iterator_base::M.aux_col1; const uword aux_col = iterator_base::M.aux_col1;
const uword aux_row = iterator_base::M.aux_row1; const uword aux_row = iterator_base::M.aux_row1;
const uword n_rows = iterator_base::M.n_rows; const uword ln_rows = iterator_base::M.n_rows;
const uword n_cols = iterator_base::M.n_cols; const uword ln_cols = iterator_base::M.n_cols;
uword cur_col = iterator_base::internal_col; uword cur_col = iterator_base::internal_col;
uword cur_pos = iterator_base::internal_pos + 1; uword cur_pos = iterator_base::internal_pos + 1;
uword skip_pos = iterator_base::skip_pos; uword lskip_pos = iterator_base::skip_pos;
uword row_index; uword row_index;
while(true) while(true)
{ {
const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]; const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];
row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos]; row_index = iterator_base::M.m.row_indices[cur_pos + lskip_pos];
// Did we move any columns? // Did we move any columns?
while((cur_col < n_cols) && ((skip_pos + cur_pos) >= iterator_base::M.m .col_ptrs[cur_col + aux_col + 1])) while((cur_col < ln_cols) && ((lskip_pos + cur_pos) >= iterator_base::M .m.col_ptrs[cur_col + aux_col + 1]))
{ {
++cur_col; ++cur_col;
} }
// Are we at the last position? // Are we at the last position?
if(cur_col >= n_cols) if(cur_col >= ln_cols)
{ {
cur_col = n_cols; cur_col = ln_cols;
// Make sure we will be pointing at the last element in the parent ma trix. // Make sure we will be pointing at the last element in the parent ma trix.
skip_pos = iterator_base::M.m.n_nonzero - iterator_base::M.n_nonzero; lskip_pos = iterator_base::M.m.n_nonzero - iterator_base::M.n_nonzero ;
break; break;
} }
if(row_index < aux_row) if(row_index < aux_row)
{ {
++skip_pos; ++lskip_pos;
} }
else if(row_index < (aux_row + n_rows)) else if(row_index < (aux_row + ln_rows))
{ {
break; // found break; // found
} }
else else
{ {
skip_pos += (next_colptr - (cur_pos + skip_pos)); lskip_pos += (next_colptr - (cur_pos + lskip_pos));
} }
} }
iterator_base::internal_pos = cur_pos; iterator_base::internal_pos = cur_pos;
iterator_base::internal_col = cur_col; iterator_base::internal_col = cur_col;
iterator_base::skip_pos = skip_pos; iterator_base::skip_pos = lskip_pos;
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
typename SpSubview<eT>::const_iterator typename SpSubview<eT>::const_iterator
SpSubview<eT>::const_iterator::operator++(int) SpSubview<eT>::const_iterator::operator++(int)
{ {
typename SpSubview<eT>::const_iterator tmp(*this); typename SpSubview<eT>::const_iterator tmp(*this);
skipping to change at line 328 skipping to change at line 328
return tmp; return tmp;
} }
template<typename eT> template<typename eT>
inline inline
typename SpSubview<eT>::const_iterator& typename SpSubview<eT>::const_iterator&
SpSubview<eT>::const_iterator::operator--() SpSubview<eT>::const_iterator::operator--()
{ {
const uword aux_col = iterator_base::M.aux_col1; const uword aux_col = iterator_base::M.aux_col1;
const uword aux_row = iterator_base::M.aux_row1; const uword aux_row = iterator_base::M.aux_row1;
const uword n_rows = iterator_base::M.n_rows; const uword ln_rows = iterator_base::M.n_rows;
uword cur_col = iterator_base::internal_col; uword cur_col = iterator_base::internal_col;
uword cur_pos = iterator_base::internal_pos - 1; uword cur_pos = iterator_base::internal_pos - 1;
uword skip_pos = iterator_base::skip_pos; uword skip_pos = iterator_base::skip_pos;
// Special condition for end of iterator. // Special condition for end of iterator.
if((skip_pos + cur_pos + 1) == iterator_base::M.m.n_nonzero) if((skip_pos + cur_pos + 1) == iterator_base::M.m.n_nonzero)
{ {
// We are at the last element. So we need to set skip_pos back to what it // We are at the last element. So we need to set skip_pos back to what it
// would be if we didn't manually modify it back in operator++(). // would be if we didn't manually modify it back in operator++().
skip_pos = iterator_base::M.m.col_ptrs[cur_col + aux_col] - iterator_ba se::internal_pos; skip_pos = iterator_base::M.m.col_ptrs[cur_col + aux_col] - iterator_ba se::internal_pos;
} }
skipping to change at line 359 skipping to change at line 359
// Did we move back any columns? // Did we move back any columns?
while((skip_pos + cur_pos) < iterator_base::M.m.col_ptrs[cur_col + aux_ col]) while((skip_pos + cur_pos) < iterator_base::M.m.col_ptrs[cur_col + aux_ col])
{ {
--cur_col; --cur_col;
} }
if(row_index < aux_row) if(row_index < aux_row)
{ {
skip_pos -= (colptr - (cur_pos + skip_pos) + 1); skip_pos -= (colptr - (cur_pos + skip_pos) + 1);
} }
else if(row_index < (aux_row + n_rows)) else if(row_index < (aux_row + ln_rows))
{ {
break; // found break; // found
} }
else else
{ {
--skip_pos; --skip_pos;
} }
} }
iterator_base::internal_pos = cur_pos; iterator_base::internal_pos = cur_pos;
iterator_base::skip_pos = skip_pos; iterator_base::skip_pos = skip_pos;
iterator_base::internal_col = cur_col; iterator_base::internal_col = cur_col;
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
typename SpSubview<eT>::const_iterator typename SpSubview<eT>::const_iterator
SpSubview<eT>::const_iterator::operator--(int) SpSubview<eT>::const_iterator::operator--(int)
{ {
skipping to change at line 532 skipping to change at line 532
if(in_M.n_nonzero == 0) if(in_M.n_nonzero == 0)
{ {
iterator_base::internal_col = 0; iterator_base::internal_col = 0;
internal_row = in_M.n_rows; internal_row = in_M.n_rows;
iterator_base::skip_pos = in_M.m.n_nonzero; iterator_base::skip_pos = in_M.m.n_nonzero;
return; return;
} }
const uword aux_col = iterator_base::M.aux_col1; const uword aux_col = iterator_base::M.aux_col1;
const uword aux_row = iterator_base::M.aux_row1; const uword aux_row = iterator_base::M.aux_row1;
const uword n_cols = iterator_base::M.n_cols; const uword ln_cols = iterator_base::M.n_cols;
// We don't know where the elements are in each row. What we will do is // We don't know where the elements are in each row. What we will do is
// loop across all valid columns looking for elements in row 0 (and add t o // loop across all valid columns looking for elements in row 0 (and add t o
// our sum), then in row 1, and so forth, until we get to the desired // our sum), then in row 1, and so forth, until we get to the desired
// position. // position.
uword cur_pos = -1; uword cur_pos = -1;
uword cur_row = 0; uword cur_row = 0;
uword cur_col = 0; uword cur_col = 0;
while(true) while(true)
skipping to change at line 574 skipping to change at line 574
// We are done with this column. Break to the column incrementing code (directly below). // We are done with this column. Break to the column incrementing code (directly below).
break; break;
} }
else if(row_index > (cur_row + aux_row)) else if(row_index > (cur_row + aux_row))
{ {
break; // Can't be in this column. break; // Can't be in this column.
} }
} }
cur_col++; // Done with the column. Move on. cur_col++; // Done with the column. Move on.
if(cur_col == n_cols) if(cur_col == ln_cols)
{ {
// Out of columns. Loop back to the beginning and look on the next r ow. // Out of columns. Loop back to the beginning and look on the next r ow.
cur_col = 0; cur_col = 0;
cur_row++; cur_row++;
} }
} }
} }
template<typename eT> template<typename eT>
inline inline
skipping to change at line 641 skipping to change at line 641
return *this; return *this;
} }
// Otherwise, we need to search. // Otherwise, we need to search.
uword cur_col = iterator_base::internal_col; uword cur_col = iterator_base::internal_col;
uword cur_row = internal_row; uword cur_row = internal_row;
const uword aux_col = iterator_base::M.aux_col1; const uword aux_col = iterator_base::M.aux_col1;
const uword aux_row = iterator_base::M.aux_row1; const uword aux_row = iterator_base::M.aux_row1;
const uword n_cols = iterator_base::M.n_cols; const uword ln_cols = iterator_base::M.n_cols;
while(true) while(true)
{ {
// Increment the current column and see if we are on a new row. // Increment the current column and see if we are on a new row.
if(++cur_col == n_cols) if(++cur_col == ln_cols)
{ {
cur_col = 0; cur_col = 0;
++cur_row; ++cur_row;
} }
// Is there anything in this new column? // Is there anything in this new column?
const uword colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col]; const uword colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col];
const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]; const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];
for(uword ind = colptr; (ind < next_colptr) && (iterator_base::M.m.row_ indices[ind] <= (cur_row + aux_row)); ++ind) for(uword ind = colptr; (ind < next_colptr) && (iterator_base::M.m.row_ indices[ind] <= (cur_row + aux_row)); ++ind)
skipping to change at line 716 skipping to change at line 716
// } // }
iterator_base::internal_pos--; iterator_base::internal_pos--;
// We have to search backwards. // We have to search backwards.
uword cur_col = iterator_base::internal_col; uword cur_col = iterator_base::internal_col;
uword cur_row = internal_row; uword cur_row = internal_row;
const uword aux_col = iterator_base::M.aux_col1; const uword aux_col = iterator_base::M.aux_col1;
const uword aux_row = iterator_base::M.aux_row1; const uword aux_row = iterator_base::M.aux_row1;
const uword n_cols = iterator_base::M.n_cols; const uword ln_cols = iterator_base::M.n_cols;
while(true) while(true)
{ {
// Decrement the current column and see if we are on a new row. // Decrement the current column and see if we are on a new row.
if(--cur_col > n_cols) if(--cur_col > ln_cols)
{ {
cur_col = n_cols - 1; cur_col = ln_cols - 1;
cur_row--; cur_row--;
} }
// Is there anything in this new column? // Is there anything in this new column?
const uword colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col]; const uword colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col];
const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]; const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];
for(uword ind = colptr; (ind < next_colptr) && (iterator_base::M.m.row_ indices[ind] <= (cur_row + aux_row)); ++ind) for(uword ind = colptr; (ind < next_colptr) && (iterator_base::M.m.row_ indices[ind] <= (cur_row + aux_row)); ++ind)
{ {
const uword row_index = iterator_base::M.m.row_indices[ind]; const uword row_index = iterator_base::M.m.row_indices[ind];
 End of changes. 45 change blocks. 
57 lines changed or deleted 58 lines changed or added


 SpSubview_meat.hpp   SpSubview_meat.hpp 
skipping to change at line 31 skipping to change at line 31
, aux_row1(in_row1) , aux_row1(in_row1)
, aux_col1(in_col1) , aux_col1(in_col1)
, n_rows(in_n_rows) , n_rows(in_n_rows)
, n_cols(in_n_cols) , n_cols(in_n_cols)
, n_elem(in_n_rows * in_n_cols) , n_elem(in_n_rows * in_n_cols)
, n_nonzero(0) , n_nonzero(0)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
// There must be a O(1) way to do this // There must be a O(1) way to do this
uword end = m.col_ptrs[in_col1 + in_n_cols]; uword lend = m.col_ptrs[in_col1 + in_n_cols];
uword end_row = in_row1 + in_n_rows; uword lend_row = in_row1 + in_n_rows;
uword count = 0; uword count = 0;
for(uword i = m.col_ptrs[in_col1]; i < end; ++i) for(uword i = m.col_ptrs[in_col1]; i < lend; ++i)
{ {
if(m.row_indices[i] >= in_row1 && m.row_indices[i] < end_row) if(m.row_indices[i] >= in_row1 && m.row_indices[i] < lend_row)
{ {
++count; ++count;
} }
} }
access::rw(n_nonzero) = count; access::rw(n_nonzero) = count;
} }
template<typename eT> template<typename eT>
arma_inline arma_inline
skipping to change at line 60 skipping to change at line 60
, aux_row1(in_row1) , aux_row1(in_row1)
, aux_col1(in_col1) , aux_col1(in_col1)
, n_rows(in_n_rows) , n_rows(in_n_rows)
, n_cols(in_n_cols) , n_cols(in_n_cols)
, n_elem(in_n_rows * in_n_cols) , n_elem(in_n_rows * in_n_cols)
, n_nonzero(0) , n_nonzero(0)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
// There must be a O(1) way to do this // There must be a O(1) way to do this
uword end = m.col_ptrs[in_col1 + in_n_cols]; uword lend = m.col_ptrs[in_col1 + in_n_cols];
uword end_row = in_row1 + in_n_rows; uword lend_row = in_row1 + in_n_rows;
uword count = 0; uword count = 0;
for(uword i = m.col_ptrs[in_col1]; i < end; ++i) for(uword i = m.col_ptrs[in_col1]; i < lend; ++i)
{ {
if(m.row_indices[i] >= in_row1 && m.row_indices[i] < end_row) if(m.row_indices[i] >= in_row1 && m.row_indices[i] < lend_row)
{ {
++count; ++count;
} }
} }
access::rw(n_nonzero) = count; access::rw(n_nonzero) = count;
} }
template<typename eT> template<typename eT>
inline inline
skipping to change at line 94 skipping to change at line 94
const SpSubview<eT>& const SpSubview<eT>&
SpSubview<eT>::operator+=(const eT val) SpSubview<eT>::operator+=(const eT val)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
if(val == eT(0)) if(val == eT(0))
{ {
return *this; return *this;
} }
const uword start_row = aux_row1; const uword lstart_row = aux_row1;
const uword end_row = aux_row1 + n_rows; const uword lend_row = aux_row1 + n_rows;
const uword start_col = aux_col1;
const uword end_col = aux_col1 + n_cols; const uword lstart_col = aux_col1;
const uword lend_col = aux_col1 + n_cols;
const uword old_n_nonzero = m.n_nonzero; const uword old_n_nonzero = m.n_nonzero;
// iterate over our part of the sparse matrix // iterate over our part of the sparse matrix
for(uword col = start_col; col < end_col; ++col) for(uword lcol = lstart_col; lcol < lend_col; ++lcol)
for(uword lrow = lstart_row; lrow < lend_row; ++lrow)
{ {
for(uword row = start_row; row < end_row; ++row) access::rw(m).at(lrow, lcol) += val;
{
access::rw(m).at(row, col) += val;
}
} }
const uword new_n_nonzero = m.n_nonzero; const uword new_n_nonzero = m.n_nonzero;
access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero);
return *this; return *this;
} }
template<typename eT> template<typename eT>
skipping to change at line 129 skipping to change at line 128
const SpSubview<eT>& const SpSubview<eT>&
SpSubview<eT>::operator-=(const eT val) SpSubview<eT>::operator-=(const eT val)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
if(val == eT(0)) if(val == eT(0))
{ {
return *this; return *this;
} }
const uword start_row = aux_row1; const uword lstart_row = aux_row1;
const uword end_row = aux_row1 + n_rows; const uword lend_row = aux_row1 + n_rows;
const uword start_col = aux_col1;
const uword end_col = aux_col1 + n_cols; const uword lstart_col = aux_col1;
const uword lend_col = aux_col1 + n_cols;
const uword old_n_nonzero = m.n_nonzero; const uword old_n_nonzero = m.n_nonzero;
for(uword col = start_col; col < end_col; ++col) for(uword lcol = lstart_col; lcol < lend_col; ++lcol)
for(uword lrow = lstart_row; lrow < lend_row; ++lrow)
{ {
for(uword row = start_row; row < end_row; ++row) access::rw(m).at(lrow, lcol) -= val;
{
access::rw(m).at(row, col) -= val;
}
} }
const uword new_n_nonzero = m.n_nonzero; const uword new_n_nonzero = m.n_nonzero;
access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero);
return *this; return *this;
} }
template<typename eT> template<typename eT>
skipping to change at line 170 skipping to change at line 168
// Turn it all into zeros. // Turn it all into zeros.
for(iterator it(*this); it != end(); ++it) for(iterator it(*this); it != end(); ++it)
{ {
(*it) = eT(0); // zero out the value. (*it) = eT(0); // zero out the value.
it.internal_pos--; it.internal_pos--;
} }
return *this; return *this;
} }
const uword start_row = aux_row1; const uword lstart_row = aux_row1;
const uword end_row = aux_row1 + n_rows; const uword lend_row = aux_row1 + n_rows;
const uword start_col = aux_col1;
const uword end_col = aux_col1 + n_cols; const uword lstart_col = aux_col1;
const uword lend_col = aux_col1 + n_cols;
for(uword c = start_col; c < end_col; ++c) for(uword c = lstart_col; c < lend_col; ++c)
{ {
for(uword r = m.col_ptrs[c]; r < m.col_ptrs[c + 1]; ++r) for(uword r = m.col_ptrs[c]; r < m.col_ptrs[c + 1]; ++r)
{ {
if(m.row_indices[r] >= start_row && m.row_indices[r] < end_row) if(m.row_indices[r] >= lstart_row && m.row_indices[r] < lend_row)
{ {
access::rw(m.values[r]) *= val; access::rw(m.values[r]) *= val;
} }
} }
} }
return *this; return *this;
} }
template<typename eT> template<typename eT>
inline inline
const SpSubview<eT>& const SpSubview<eT>&
SpSubview<eT>::operator/=(const eT val) SpSubview<eT>::operator/=(const eT val)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
const uword start_col = aux_col1; const uword lstart_col = aux_col1;
const uword end_col = aux_col1 + n_cols; const uword lend_col = aux_col1 + n_cols;
const uword start_row = aux_row1;
const uword end_row = aux_row1 + n_rows; const uword lstart_row = aux_row1;
const uword lend_row = aux_row1 + n_rows;
const uword old_n_nonzero = m.n_nonzero; const uword old_n_nonzero = m.n_nonzero;
for(uword c = start_col; c < end_col; ++c) for(uword c = lstart_col; c < lend_col; ++c)
for(uword r = lstart_row; r < lend_row; ++r)
{ {
for(uword r = start_row; r < end_row; ++r) access::rw(m).at(r, c) /= val;
{
access::rw(m).at(r, c) /= val;
}
} }
const uword new_n_nonzero = m.n_nonzero; const uword new_n_nonzero = m.n_nonzero;
access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero); access::rw(n_nonzero) += (new_n_nonzero - old_n_nonzero);
return *this; return *this;
} }
template<typename eT> template<typename eT>
skipping to change at line 642 skipping to change at line 640
SpSubview<eT>::operator/=(const SpBase<eT, T1>& x) SpSubview<eT>::operator/=(const SpBase<eT, T1>& x)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
SpProxy<T1> p(x.get_ref()); SpProxy<T1> p(x.get_ref());
arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols( ), "element-wise division"); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols( ), "element-wise division");
if(p.is_alias(m) == false) if(p.is_alias(m) == false)
{ {
for(uword col = 0; col < n_cols; ++col) for(uword lcol = 0; lcol < n_cols; ++lcol)
for(uword row = 0; row < n_rows; ++row) for(uword lrow = 0; lrow < n_rows; ++lrow)
{ {
at(row,col) /= p.at(row,col); at(lrow,lcol) /= p.at(lrow,lcol);
} }
} }
else else
{ {
const SpMat<eT> tmp(p.Q); const SpMat<eT> tmp(p.Q);
(*this).operator/=(tmp); (*this).operator/=(tmp);
} }
return *this; return *this;
skipping to change at line 669 skipping to change at line 667
inline inline
void void
SpSubview<eT>::fill(const eT val) SpSubview<eT>::fill(const eT val)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
if(val != eT(0)) if(val != eT(0))
{ {
// TODO: implement a faster version; the code below is slow // TODO: implement a faster version; the code below is slow
const uword start_row = aux_row1; const uword lstart_row = aux_row1;
const uword end_row = aux_row1 + n_rows; const uword lend_row = aux_row1 + n_rows;
const uword start_col = aux_col1;
const uword end_col = aux_col1 + n_cols; const uword lstart_col = aux_col1;
const uword lend_col = aux_col1 + n_cols;
const uword orig_nonzero = m.n_nonzero; const uword orig_nonzero = m.n_nonzero;
// iterate over our part of the sparse matrix // iterate over our part of the sparse matrix
for(uword col = start_col; col < end_col; ++col) for(uword lcol = lstart_col; lcol < lend_col; ++lcol)
for(uword row = start_row; row < end_row; ++row) for(uword lrow = lstart_row; lrow < lend_row; ++lrow)
{ {
access::rw(m).at(row, col) = val; access::rw(m).at(lrow, lcol) = val;
} }
access::rw(n_nonzero) += (m.n_nonzero - orig_nonzero); access::rw(n_nonzero) += (m.n_nonzero - orig_nonzero);
} }
else else
{ {
(*this).zeros(); (*this).zeros();
} }
} }
skipping to change at line 749 skipping to change at line 748
access::rw(n_nonzero) += (m.n_nonzero - orig_nonzero); access::rw(n_nonzero) += (m.n_nonzero - orig_nonzero);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
inline inline
SpValProxy<SpSubview<eT> > SpValProxy<SpSubview<eT> >
SpSubview<eT>::operator[](const uword i) SpSubview<eT>::operator[](const uword i)
{ {
const uword row = i % n_rows; const uword lrow = i % n_rows;
const uword col = i / n_rows; const uword lcol = i / n_rows;
return (*this).at(row, col); return (*this).at(lrow, lcol);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
inline inline
eT eT
SpSubview<eT>::operator[](const uword i) const SpSubview<eT>::operator[](const uword i) const
{ {
const uword row = i % n_rows; const uword lrow = i % n_rows;
const uword col = i / n_rows; const uword lcol = i / n_rows;
return (*this).at(row, col); return (*this).at(lrow, lcol);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
inline inline
SpValProxy< SpSubview<eT> > SpValProxy< SpSubview<eT> >
SpSubview<eT>::operator()(const uword i) SpSubview<eT>::operator()(const uword i)
{ {
arma_debug_check( (i >= n_elem), "SpSubview::operator(): index out of bou nds"); arma_debug_check( (i >= n_elem), "SpSubview::operator(): index out of bou nds");
const uword row = i % n_rows; const uword lrow = i % n_rows;
const uword col = i / n_rows; const uword lcol = i / n_rows;
return (*this).at(row, col); return (*this).at(lrow, lcol);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
inline inline
eT eT
SpSubview<eT>::operator()(const uword i) const SpSubview<eT>::operator()(const uword i) const
{ {
arma_debug_check( (i >= n_elem), "SpSubview::operator(): index out of bou nds"); arma_debug_check( (i >= n_elem), "SpSubview::operator(): index out of bou nds");
const uword row = i % n_rows; const uword lrow = i % n_rows;
const uword col = i / n_rows; const uword lcol = i / n_rows;
return (*this).at(row, col); return (*this).at(lrow, lcol);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
inline inline
SpValProxy< SpSubview<eT> > SpValProxy< SpSubview<eT> >
SpSubview<eT>::operator()(const uword in_row, const uword in_col) SpSubview<eT>::operator()(const uword in_row, const uword in_col)
{ {
arma_debug_check( (in_row >= n_rows) || (in_col >= n_cols), "SpSubview::o perator(): index out of bounds"); arma_debug_check( (in_row >= n_rows) || (in_col >= n_cols), "SpSubview::o perator(): index out of bounds");
skipping to change at line 823 skipping to change at line 822
return (*this).at(in_row, in_col); return (*this).at(in_row, in_col);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
inline inline
SpValProxy< SpSubview<eT> > SpValProxy< SpSubview<eT> >
SpSubview<eT>::at(const uword i) SpSubview<eT>::at(const uword i)
{ {
const uword row = i % n_rows; const uword lrow = i % n_rows;
const uword col = i / n_cols; const uword lcol = i / n_cols;
return (*this).at(row, col); return (*this).at(lrow, lcol);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
inline inline
eT eT
SpSubview<eT>::at(const uword i) const SpSubview<eT>::at(const uword i) const
{ {
const uword row = i % n_rows; const uword lrow = i % n_rows;
const uword col = i / n_cols; const uword lcol = i / n_cols;
return (*this).at(row, col); return (*this).at(lrow, lcol);
} }
template<typename eT> template<typename eT>
arma_hot arma_hot
inline inline
SpValProxy< SpSubview<eT> > SpValProxy< SpSubview<eT> >
SpSubview<eT>::at(const uword in_row, const uword in_col) SpSubview<eT>::at(const uword in_row, const uword in_col)
{ {
const uword colptr = m.col_ptrs[in_col + aux_col1]; const uword colptr = m.col_ptrs[in_col + aux_col1];
const uword next_colptr = m.col_ptrs[in_col + aux_col1 + 1]; const uword next_colptr = m.col_ptrs[in_col + aux_col1 + 1];
skipping to change at line 1193 skipping to change at line 1192
template<typename eT> template<typename eT>
inline inline
void void
SpSubview<eT>::swap_rows(const uword in_row1, const uword in_row2) SpSubview<eT>::swap_rows(const uword in_row1, const uword in_row2)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_check((in_row1 >= n_rows) || (in_row2 >= n_rows), "SpSubview:: swap_rows(): invalid row index"); arma_debug_check((in_row1 >= n_rows) || (in_row2 >= n_rows), "SpSubview:: swap_rows(): invalid row index");
const uword start_col = aux_col1; const uword lstart_col = aux_col1;
const uword end_col = aux_col1 + n_cols; const uword lend_col = aux_col1 + n_cols;
for(uword c = start_col; c < end_col; ++c) for(uword c = lstart_col; c < lend_col; ++c)
{ {
eT val = m.at(in_row1 + aux_row1, c); eT val = m.at(in_row1 + aux_row1, c);
access::rw(m).at(in_row2 + aux_row1, c) = m.at(in_row1 + aux_row1, c); access::rw(m).at(in_row2 + aux_row1, c) = m.at(in_row1 + aux_row1, c);
access::rw(m).at(in_row1 + aux_row1, c) = val; access::rw(m).at(in_row1 + aux_row1, c) = val;
} }
} }
template<typename eT> template<typename eT>
inline inline
void void
SpSubview<eT>::swap_cols(const uword in_col1, const uword in_col2) SpSubview<eT>::swap_cols(const uword in_col1, const uword in_col2)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_check((in_col1 >= n_cols) || (in_col2 >= n_cols), "SpSubview:: swap_cols(): invalid column index"); arma_debug_check((in_col1 >= n_cols) || (in_col2 >= n_cols), "SpSubview:: swap_cols(): invalid column index");
const uword start_row = aux_row1; const uword lstart_row = aux_row1;
const uword end_row = aux_row1 + n_rows; const uword lend_row = aux_row1 + n_rows;
for(uword r = start_row; r < end_row; ++r) for(uword r = lstart_row; r < lend_row; ++r)
{ {
eT val = m.at(r, in_col1 + aux_col1); eT val = m.at(r, in_col1 + aux_col1);
access::rw(m).at(r, in_col1 + aux_col1) = m.at(r, in_col2 + aux_col1); access::rw(m).at(r, in_col1 + aux_col1) = m.at(r, in_col2 + aux_col1);
access::rw(m).at(r, in_col2 + aux_col1) = val; access::rw(m).at(r, in_col2 + aux_col1) = val;
} }
} }
template<typename eT> template<typename eT>
inline inline
typename SpSubview<eT>::iterator typename SpSubview<eT>::iterator
 End of changes. 39 change blocks. 
76 lines changed or deleted 75 lines changed or added


 arma_ostream_meat.hpp   arma_ostream_meat.hpp 
skipping to change at line 551 skipping to change at line 551
{ {
o << "[matrix size: " << m_n_rows << 'x' << m_n_cols << "]\n"; o << "[matrix size: " << m_n_rows << 'x' << m_n_cols << "]\n";
} }
else else
{ {
eT tmp[1]; eT tmp[1];
tmp[0] = eT(0); tmp[0] = eT(0);
const std::streamsize cell_width = modify ? arma_ostream::modify_stre am(o, &tmp[0], 1) : o.width(); const std::streamsize cell_width = modify ? arma_ostream::modify_stre am(o, &tmp[0], 1) : o.width();
const uword m_n_rows = m.n_rows;
const uword m_n_cols = m.n_cols;
for(uword row=0; row < m_n_rows; ++row) for(uword row=0; row < m_n_rows; ++row)
{ {
for(uword col=0; col < m_n_cols; ++col) for(uword col=0; col < m_n_cols; ++col)
{ {
o.width(cell_width); o.width(cell_width);
arma_ostream::print_elem_zero<eT>(o, modify); arma_ostream::print_elem_zero<eT>(o, modify);
o << ' '; o << ' ';
} }
 End of changes. 1 change blocks. 
3 lines changed or deleted 0 lines changed or added


 arma_version.hpp   arma_version.hpp 
skipping to change at line 18 skipping to change at line 18
// Lesser General Public License (LGPL) as published // Lesser General Public License (LGPL) as published
// by the Free Software Foundation, either version 3 // by the Free Software Foundation, either version 3
// of the License or (at your option) any later version. // of the License or (at your option) any later version.
// (see http://www.opensource.org/licenses for more info) // (see http://www.opensource.org/licenses for more info)
//! \addtogroup arma_version //! \addtogroup arma_version
//! @{ //! @{
#define ARMA_VERSION_MAJOR 3 #define ARMA_VERSION_MAJOR 3
#define ARMA_VERSION_MINOR 6 #define ARMA_VERSION_MINOR 6
#define ARMA_VERSION_PATCH 2 #define ARMA_VERSION_PATCH 3
#define ARMA_VERSION_NAME "Piazza del Duomo" #define ARMA_VERSION_NAME "Piazza del Duomo"
struct arma_version struct arma_version
{ {
static const unsigned int major = ARMA_VERSION_MAJOR; static const unsigned int major = ARMA_VERSION_MAJOR;
static const unsigned int minor = ARMA_VERSION_MINOR; static const unsigned int minor = ARMA_VERSION_MINOR;
static const unsigned int patch = ARMA_VERSION_PATCH; static const unsigned int patch = ARMA_VERSION_PATCH;
static static
inline inline
 End of changes. 1 change blocks. 
1 lines changed or deleted 1 lines changed or added


 diskio_meat.hpp   diskio_meat.hpp 
skipping to change at line 2582 skipping to change at line 2582
} }
return load_okay; return load_okay;
} }
template<typename T> template<typename T>
inline inline
bool bool
diskio::load_coord_ascii(SpMat< std::complex<T> >& x, std::istream& f, std: :string& err_msg) diskio::load_coord_ascii(SpMat< std::complex<T> >& x, std::istream& f, std: :string& err_msg)
{ {
typedef std::complex<T> eT;
bool load_okay = f.good(); bool load_okay = f.good();
f.clear(); f.clear();
const std::fstream::pos_type pos1 = f.tellg(); const std::fstream::pos_type pos1 = f.tellg();
// //
// work out the size // work out the size
uword f_n_rows = 0; uword f_n_rows = 0;
uword f_n_cols = 0; uword f_n_cols = 0;
 End of changes. 1 change blocks. 
2 lines changed or deleted 0 lines changed or added


 eGlueCube_meat.hpp   eGlueCube_meat.hpp 
skipping to change at line 84 skipping to change at line 84
eGlueCube<T1,T2,eglue_type>::get_n_elem() const eGlueCube<T1,T2,eglue_type>::get_n_elem() const
{ {
return P1.get_n_elem(); return P1.get_n_elem();
} }
template<typename T1, typename T2, typename eglue_type> template<typename T1, typename T2, typename eglue_type>
arma_inline arma_inline
typename T1::elem_type typename T1::elem_type
eGlueCube<T1,T2,eglue_type>::operator[] (const uword i) const eGlueCube<T1,T2,eglue_type>::operator[] (const uword i) const
{ {
typedef typename T1::elem_type eT;
// the optimiser will keep only one return statement // the optimiser will keep only one return statement
if(is_same_type<eglue_type, eglue_plus >::value == true) { return P1 [i] + P2[i]; } if(is_same_type<eglue_type, eglue_plus >::value == true) { return P1 [i] + P2[i]; }
else if(is_same_type<eglue_type, eglue_minus>::value == true) { return P1 [i] - P2[i]; } else if(is_same_type<eglue_type, eglue_minus>::value == true) { return P1 [i] - P2[i]; }
else if(is_same_type<eglue_type, eglue_div >::value == true) { return P1 [i] / P2[i]; } else if(is_same_type<eglue_type, eglue_div >::value == true) { return P1 [i] / P2[i]; }
else if(is_same_type<eglue_type, eglue_schur>::value == true) { return P1 [i] * P2[i]; } else if(is_same_type<eglue_type, eglue_schur>::value == true) { return P1 [i] * P2[i]; }
} }
template<typename T1, typename T2, typename eglue_type> template<typename T1, typename T2, typename eglue_type>
arma_inline arma_inline
typename T1::elem_type typename T1::elem_type
eGlueCube<T1,T2,eglue_type>::at(const uword row, const uword col, const uwo rd slice) const eGlueCube<T1,T2,eglue_type>::at(const uword row, const uword col, const uwo rd slice) const
{ {
typedef typename T1::elem_type eT;
// the optimiser will keep only one return statement // the optimiser will keep only one return statement
if(is_same_type<eglue_type, eglue_plus >::value == true) { return P1 .at(row,col,slice) + P2.at(row,col,slice); } if(is_same_type<eglue_type, eglue_plus >::value == true) { return P1 .at(row,col,slice) + P2.at(row,col,slice); }
else if(is_same_type<eglue_type, eglue_minus>::value == true) { return P1 .at(row,col,slice) - P2.at(row,col,slice); } else if(is_same_type<eglue_type, eglue_minus>::value == true) { return P1 .at(row,col,slice) - P2.at(row,col,slice); }
else if(is_same_type<eglue_type, eglue_div >::value == true) { return P1 .at(row,col,slice) / P2.at(row,col,slice); } else if(is_same_type<eglue_type, eglue_div >::value == true) { return P1 .at(row,col,slice) / P2.at(row,col,slice); }
else if(is_same_type<eglue_type, eglue_schur>::value == true) { return P1 .at(row,col,slice) * P2.at(row,col,slice); } else if(is_same_type<eglue_type, eglue_schur>::value == true) { return P1 .at(row,col,slice) * P2.at(row,col,slice); }
} }
//! @} //! @}
 End of changes. 2 change blocks. 
4 lines changed or deleted 0 lines changed or added


 eGlue_meat.hpp   eGlue_meat.hpp 
skipping to change at line 69 skipping to change at line 69
eGlue<T1,T2,eglue_type>::get_n_elem() const eGlue<T1,T2,eglue_type>::get_n_elem() const
{ {
return Proxy<T1>::is_fixed ? P1.get_n_elem() : ( Proxy<T2>::is_fixed ? P2 .get_n_elem() : P1.get_n_elem() ) ; return Proxy<T1>::is_fixed ? P1.get_n_elem() : ( Proxy<T2>::is_fixed ? P2 .get_n_elem() : P1.get_n_elem() ) ;
} }
template<typename T1, typename T2, typename eglue_type> template<typename T1, typename T2, typename eglue_type>
arma_inline arma_inline
typename T1::elem_type typename T1::elem_type
eGlue<T1,T2,eglue_type>::operator[] (const uword ii) const eGlue<T1,T2,eglue_type>::operator[] (const uword ii) const
{ {
typedef typename T1::elem_type eT;
// the optimiser will keep only one return statement // the optimiser will keep only one return statement
if(is_same_type<eglue_type, eglue_plus >::value == true) { return P1 [ii] + P2[ii]; } if(is_same_type<eglue_type, eglue_plus >::value == true) { return P1 [ii] + P2[ii]; }
else if(is_same_type<eglue_type, eglue_minus>::value == true) { return P1 [ii] - P2[ii]; } else if(is_same_type<eglue_type, eglue_minus>::value == true) { return P1 [ii] - P2[ii]; }
else if(is_same_type<eglue_type, eglue_div >::value == true) { return P1 [ii] / P2[ii]; } else if(is_same_type<eglue_type, eglue_div >::value == true) { return P1 [ii] / P2[ii]; }
else if(is_same_type<eglue_type, eglue_schur>::value == true) { return P1 [ii] * P2[ii]; } else if(is_same_type<eglue_type, eglue_schur>::value == true) { return P1 [ii] * P2[ii]; }
} }
template<typename T1, typename T2, typename eglue_type> template<typename T1, typename T2, typename eglue_type>
arma_inline arma_inline
typename T1::elem_type typename T1::elem_type
eGlue<T1,T2,eglue_type>::at(const uword row, const uword col) const eGlue<T1,T2,eglue_type>::at(const uword row, const uword col) const
{ {
typedef typename T1::elem_type eT;
// the optimiser will keep only one return statement // the optimiser will keep only one return statement
if(is_same_type<eglue_type, eglue_plus >::value == true) { return P1 .at(row,col) + P2.at(row,col); } if(is_same_type<eglue_type, eglue_plus >::value == true) { return P1 .at(row,col) + P2.at(row,col); }
else if(is_same_type<eglue_type, eglue_minus>::value == true) { return P1 .at(row,col) - P2.at(row,col); } else if(is_same_type<eglue_type, eglue_minus>::value == true) { return P1 .at(row,col) - P2.at(row,col); }
else if(is_same_type<eglue_type, eglue_div >::value == true) { return P1 .at(row,col) / P2.at(row,col); } else if(is_same_type<eglue_type, eglue_div >::value == true) { return P1 .at(row,col) / P2.at(row,col); }
else if(is_same_type<eglue_type, eglue_schur>::value == true) { return P1 .at(row,col) * P2.at(row,col); } else if(is_same_type<eglue_type, eglue_schur>::value == true) { return P1 .at(row,col) * P2.at(row,col); }
} }
//! @} //! @}
 End of changes. 2 change blocks. 
4 lines changed or deleted 0 lines changed or added


 eOpCube_meat.hpp   eOpCube_meat.hpp 
skipping to change at line 120 skipping to change at line 120
eOpCube<T1, eop_type>::operator[] (const uword i) const eOpCube<T1, eop_type>::operator[] (const uword i) const
{ {
return eop_core<eop_type>::process(P[i], aux); return eop_core<eop_type>::process(P[i], aux);
} }
template<typename T1, typename eop_type> template<typename T1, typename eop_type>
arma_inline arma_inline
typename T1::elem_type typename T1::elem_type
eOpCube<T1, eop_type>::at(const uword row, const uword col, const uword sli ce) const eOpCube<T1, eop_type>::at(const uword row, const uword col, const uword sli ce) const
{ {
typedef typename T1::elem_type eT;
return eop_core<eop_type>::process(P.at(row, col, slice), aux); return eop_core<eop_type>::process(P.at(row, col, slice), aux);
} }
//! @} //! @}
 End of changes. 1 change blocks. 
2 lines changed or deleted 0 lines changed or added


 fn_conv_to.hpp   fn_conv_to.hpp 
skipping to change at line 266 skipping to change at line 266
inline inline
Row<out_eT> Row<out_eT>
conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma _not_cx<in_eT>::result* junk) conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma _not_cx<in_eT>::result* junk)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
const unwrap<T1> tmp(in.get_ref()); const unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M; const Mat<in_eT>& X = tmp.M;
arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't b e interpreted as a vector" ); arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), " conv_to(): given object can't be interpreted as a vector" );
Row<out_eT> out(X.n_elem); Row<out_eT> out(X.n_elem);
arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); arrayops::convert( out.memptr(), X.memptr(), out.n_elem );
return out; return out;
} }
template<typename out_eT> template<typename out_eT>
template<typename in_eT, typename T1> template<typename in_eT, typename T1>
inline inline
Row<out_eT> Row<out_eT>
conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma _cx_only<in_eT>::result* junk) conv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma _cx_only<in_eT>::result* junk)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
const unwrap<T1> tmp(in.get_ref()); const unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M; const Mat<in_eT>& X = tmp.M;
arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't b e interpreted as a vector" ); arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), " conv_to(): given object can't be interpreted as a vector" );
Row<out_eT> out(X.n_rows, X.n_cols); Row<out_eT> out(X.n_rows, X.n_cols);
arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem );
return out; return out;
} }
template<typename out_eT> template<typename out_eT>
template<typename in_eT> template<typename in_eT>
skipping to change at line 385 skipping to change at line 385
inline inline
Col<out_eT> Col<out_eT>
conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma _not_cx<in_eT>::result* junk) conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma _not_cx<in_eT>::result* junk)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
const unwrap<T1> tmp(in.get_ref()); const unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M; const Mat<in_eT>& X = tmp.M;
arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't b e interpreted as a vector" ); arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), " conv_to(): given object can't be interpreted as a vector" );
Col<out_eT> out(X.n_elem); Col<out_eT> out(X.n_elem);
arrayops::convert( out.memptr(), X.memptr(), out.n_elem ); arrayops::convert( out.memptr(), X.memptr(), out.n_elem );
return out; return out;
} }
template<typename out_eT> template<typename out_eT>
template<typename in_eT, typename T1> template<typename in_eT, typename T1>
inline inline
Col<out_eT> Col<out_eT>
conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma _cx_only<in_eT>::result* junk) conv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma _cx_only<in_eT>::result* junk)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
const unwrap<T1> tmp(in.get_ref()); const unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M; const Mat<in_eT>& X = tmp.M;
arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't b e interpreted as a vector" ); arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), " conv_to(): given object can't be interpreted as a vector" );
Col<out_eT> out(X.n_rows, X.n_cols); Col<out_eT> out(X.n_rows, X.n_cols);
arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem ); arrayops::convert_cx( out.memptr(), X.memptr(), out.n_elem );
return out; return out;
} }
template<typename out_eT> template<typename out_eT>
template<typename in_eT> template<typename in_eT>
skipping to change at line 549 skipping to change at line 549
inline inline
std::vector<out_eT> std::vector<out_eT>
conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typen ame arma_not_cx<in_eT>::result* junk) conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typen ame arma_not_cx<in_eT>::result* junk)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
const unwrap<T1> tmp(in.get_ref()); const unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M; const Mat<in_eT>& X = tmp.M;
arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't b e interpreted as a vector" ); arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), " conv_to(): given object can't be interpreted as a vector" );
const uword N = X.n_elem; const uword N = X.n_elem;
std::vector<out_eT> out(N); std::vector<out_eT> out(N);
if(N > 0) if(N > 0)
{ {
out_eT* out_mem = &(out[0]); out_eT* out_mem = &(out[0]);
const in_eT* X_mem = X.memptr(); const in_eT* X_mem = X.memptr();
skipping to change at line 581 skipping to change at line 581
inline inline
std::vector<out_eT> std::vector<out_eT>
conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typen ame arma_cx_only<in_eT>::result* junk) conv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typen ame arma_cx_only<in_eT>::result* junk)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
const unwrap<T1> tmp(in.get_ref()); const unwrap<T1> tmp(in.get_ref());
const Mat<in_eT>& X = tmp.M; const Mat<in_eT>& X = tmp.M;
arma_debug_check( (X.is_vec() == false), "conv_to(): given object can't b e interpreted as a vector" ); arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), " conv_to(): given object can't be interpreted as a vector" );
std::vector<out_eT> out(X.n_elem); std::vector<out_eT> out(X.n_elem);
typename Mat<in_eT>::const_iterator X_begin = X.begin(); typename Mat<in_eT>::const_iterator X_begin = X.begin();
typename Mat<in_eT>::const_iterator X_end = X.end(); typename Mat<in_eT>::const_iterator X_end = X.end();
typename std::vector<out_eT>::iterator out_begin = out.begin(); typename std::vector<out_eT>::iterator out_begin = out.begin();
typename std::vector<out_eT>::iterator out_end = out.end(); typename std::vector<out_eT>::iterator out_end = out.end();
typename Mat<in_eT>::const_iterator X_it; typename Mat<in_eT>::const_iterator X_it;
 End of changes. 6 change blocks. 
6 lines changed or deleted 6 lines changed or added


 fn_eps.hpp   fn_eps.hpp 
skipping to change at line 25 skipping to change at line 25
//! @{ //! @{
//! \brief //! \brief
//! eps version for non-complex matrices and vectors //! eps version for non-complex matrices and vectors
template<typename T1> template<typename T1>
inline inline
const eOp<T1, eop_eps> const eOp<T1, eop_eps>
eps(const Base<typename T1::elem_type, T1>& X, const typename arma_not_cx<t ypename T1::elem_type>::result* junk = 0) eps(const Base<typename T1::elem_type, T1>& X, const typename arma_not_cx<t ypename T1::elem_type>::result* junk = 0)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
typedef typename T1::elem_type eT;
return eOp<T1, eop_eps>(X.get_ref()); return eOp<T1, eop_eps>(X.get_ref());
} }
//! \brief //! \brief
//! eps version for complex matrices and vectors //! eps version for complex matrices and vectors
template<typename T1> template<typename T1>
inline inline
Mat< typename T1::pod_type > Mat< typename T1::pod_type >
eps(const Base< std::complex<typename T1::pod_type>, T1>& X, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0) eps(const Base< std::complex<typename T1::pod_type>, T1>& X, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0)
{ {
 End of changes. 2 change blocks. 
3 lines changed or deleted 0 lines changed or added


 fn_mean.hpp   fn_mean.hpp 
skipping to change at line 80 skipping to change at line 80
//! invoked, for example, by: mean(mean(A)) //! invoked, for example, by: mean(mean(A))
template<typename T1> template<typename T1>
inline inline
arma_warn_unused arma_warn_unused
typename T1::elem_type typename T1::elem_type
mean(const Op<T1, op_mean>& in) mean(const Op<T1, op_mean>& in)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_extra_debug_print("mean(): two consecutive mean() calls detected"); arma_extra_debug_print("mean(): two consecutive mean() calls detected");
typedef typename T1::elem_type eT;
return op_mean::mean_all(in.m); return op_mean::mean_all(in.m);
} }
template<typename T1> template<typename T1>
arma_inline arma_inline
const Op< Op<T1, op_mean>, op_mean> const Op< Op<T1, op_mean>, op_mean>
mean(const Op<T1, op_mean>& in, const uword dim) mean(const Op<T1, op_mean>& in, const uword dim)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
 End of changes. 1 change blocks. 
2 lines changed or deleted 0 lines changed or added


 fn_misc.hpp   fn_misc.hpp 
skipping to change at line 172 skipping to change at line 172
template<typename T1> template<typename T1>
arma_inline arma_inline
Op<T1, op_sympd> Op<T1, op_sympd>
sympd(const Base<typename T1::elem_type,T1>& X) sympd(const Base<typename T1::elem_type,T1>& X)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
return Op<T1, op_sympd>(X.get_ref()); return Op<T1, op_sympd>(X.get_ref());
} }
// template<typename eT>
// inline
// void
// swap(Mat<eT>& A, Mat<eT>& B)
// {
// arma_extra_debug_sigprint();
//
// const uword A_mem_state = A.mem_state;
//
// if( (A.vec_state == B.vec_state) && (A_mem_state == B.mem_state) && ((
A_mem_state == 0) || (A_mem_state == 3)) )
// {
// A.swap(B);
// }
// else
// {
// if(A.n_elem <= B.n_elem)
// {
// Mat<eT> C = A;
//
// A.steal_mem(B);
// B.steal_mem(C);
// }
// else
// {
// Mat<eT> C = B;
//
// B.steal_mem(A);
// A.steal_mem(C);
// }
// }
// }
//! @} //! @}
 End of changes. 1 change blocks. 
0 lines changed or deleted 33 lines changed or added


 fn_norm.hpp   fn_norm.hpp 
skipping to change at line 470 skipping to change at line 470
norm norm
( (
const T1& X, const T1& X,
const uword k, const uword k,
const typename arma_float_or_cx_only<typename T1::elem_type>::result* jun k = 0 const typename arma_float_or_cx_only<typename T1::elem_type>::result* jun k = 0
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
typedef typename T1::elem_type eT; typedef typename T1::pod_type T;
typedef typename T1::pod_type T;
const Proxy<T1> P(X); const Proxy<T1> P(X);
if(P.get_n_elem() == 0) if(P.get_n_elem() == 0)
{ {
return T(0); return T(0);
} }
const bool is_vec = (P.get_n_rows() == 1) || (P.get_n_cols() == 1); const bool is_vec = (P.get_n_rows() == 1) || (P.get_n_cols() == 1);
skipping to change at line 534 skipping to change at line 533
norm norm
( (
const T1& X, const T1& X,
const char* method, const char* method,
const typename arma_float_or_cx_only<typename T1::elem_type>::result* jun k = 0 const typename arma_float_or_cx_only<typename T1::elem_type>::result* jun k = 0
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
typedef typename T1::elem_type eT; typedef typename T1::pod_type T;
typedef typename T1::pod_type T;
const Proxy<T1> P(X); const Proxy<T1> P(X);
if(P.get_n_elem() == 0) if(P.get_n_elem() == 0)
{ {
return T(0); return T(0);
} }
const char sig = method[0]; const char sig = method[0];
const bool is_vec = (P.get_n_rows() == 1) || (P.get_n_cols() == 1); const bool is_vec = (P.get_n_rows() == 1) || (P.get_n_cols() == 1);
 End of changes. 2 change blocks. 
4 lines changed or deleted 2 lines changed or added


 fn_rank.hpp   fn_rank.hpp 
skipping to change at line 32 skipping to change at line 32
rank rank
( (
const Base<typename T1::elem_type,T1>& X, const Base<typename T1::elem_type,T1>& X,
typename T1::pod_type tol = 0.0, typename T1::pod_type tol = 0.0,
const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
typedef typename T1::elem_type eT; typedef typename T1::pod_type T;
typedef typename T1::pod_type T;
uword X_n_rows; uword X_n_rows;
uword X_n_cols; uword X_n_cols;
Col<T> s; Col<T> s;
const bool status = auxlib::svd(s, X, X_n_rows, X_n_cols); const bool status = auxlib::svd(s, X, X_n_rows, X_n_cols);
const uword n_elem = s.n_elem; const uword n_elem = s.n_elem;
if(status == true) if(status == true)
{ {
 End of changes. 1 change blocks. 
2 lines changed or deleted 1 lines changed or added


 fn_reshape.hpp   fn_reshape.hpp 
skipping to change at line 25 skipping to change at line 25
template<typename T1> template<typename T1>
inline inline
const Op<T1, op_reshape> const Op<T1, op_reshape>
reshape(const Base<typename T1::elem_type,T1>& X, const uword in_n_rows, co nst uword in_n_cols, const uword dim = 0) reshape(const Base<typename T1::elem_type,T1>& X, const uword in_n_rows, co nst uword in_n_cols, const uword dim = 0)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_check( (dim > 1), "reshape(): dim must be 0 or 1"); arma_debug_check( (dim > 1), "reshape(): dim must be 0 or 1");
typedef typename T1::elem_type eT;
return Op<T1, op_reshape>(X.get_ref(), in_n_rows, in_n_cols, dim, 'j'); return Op<T1, op_reshape>(X.get_ref(), in_n_rows, in_n_cols, dim, 'j');
} }
template<typename T1> template<typename T1>
inline inline
const OpCube<T1, op_reshape> const OpCube<T1, op_reshape>
reshape(const BaseCube<typename T1::elem_type,T1>& X, const uword in_n_rows , const uword in_n_cols, const uword in_n_slices, const uword dim = 0) reshape(const BaseCube<typename T1::elem_type,T1>& X, const uword in_n_rows , const uword in_n_cols, const uword in_n_slices, const uword dim = 0)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_debug_check( (dim > 1), "reshape(): dim must be 0 or 1"); arma_debug_check( (dim > 1), "reshape(): dim must be 0 or 1");
typedef typename T1::elem_type eT;
return OpCube<T1, op_reshape>(X.get_ref(), in_n_rows, in_n_cols, in_n_sli ces, dim, 'j'); return OpCube<T1, op_reshape>(X.get_ref(), in_n_rows, in_n_cols, in_n_sli ces, dim, 'j');
} }
//! @} //! @}
 End of changes. 2 change blocks. 
4 lines changed or deleted 0 lines changed or added


 fn_svd.hpp   fn_svd.hpp 
skipping to change at line 83 skipping to change at line 83
Col<typename T1::pod_type >& S, Col<typename T1::pod_type >& S,
Mat<typename T1::elem_type>& V, Mat<typename T1::elem_type>& V,
const Base<typename T1::elem_type,T1>& X, const Base<typename T1::elem_type,T1>& X,
const char* method = "", const char* method = "",
const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
typedef typename T1::elem_type eT;
arma_debug_check arma_debug_check
( (
( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*) (&V)) ), ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*) (&V)) ),
"svd(): two or more output objects are the same object" "svd(): two or more output objects are the same object"
); );
bool use_divide_and_conquer = false; bool use_divide_and_conquer = false;
const char sig = method[0]; const char sig = method[0];
skipping to change at line 142 skipping to change at line 140
Col<typename T1::pod_type >& S, Col<typename T1::pod_type >& S,
Mat<typename T1::elem_type>& V, Mat<typename T1::elem_type>& V,
const Base<typename T1::elem_type,T1>& X, const Base<typename T1::elem_type,T1>& X,
const char mode = 'b', const char mode = 'b',
const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0 const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk); arma_ignore(junk);
typedef typename T1::elem_type eT;
arma_debug_check arma_debug_check
( (
( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*) (&V)) ), ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*) (&V)) ),
"svd_econ(): two or more output objects are the same object" "svd_econ(): two or more output objects are the same object"
); );
arma_debug_check arma_debug_check
( (
( (mode != 'l') && (mode != 'r') && (mode != 'b') ), ( (mode != 'l') && (mode != 'r') && (mode != 'b') ),
"svd_econ(): parameter 'mode' is incorrect" "svd_econ(): parameter 'mode' is incorrect"
 End of changes. 2 change blocks. 
4 lines changed or deleted 0 lines changed or added


 glue_times_meat.hpp   glue_times_meat.hpp 
skipping to change at line 80 skipping to change at line 80
partial_unwrap_check<T1>::do_trans, partial_unwrap_check<T1>::do_trans,
partial_unwrap_check<T2>::do_trans, partial_unwrap_check<T2>::do_trans,
(partial_unwrap_check<T1>::do_times || partial_unwrap_check<T2>::do_t imes) (partial_unwrap_check<T1>::do_times || partial_unwrap_check<T2>::do_t imes)
> >
(out, A, B, alpha); (out, A, B, alpha);
} }
else else
{ {
arma_extra_debug_print("glue_times_redirect<2>::apply(): detected inv(A )*B"); arma_extra_debug_print("glue_times_redirect<2>::apply(): detected inv(A )*B");
typedef typename strip_inv<T1>::stored_type T1_stripped;
const strip_inv<T1> A_strip(X.A); const strip_inv<T1> A_strip(X.A);
Mat<eT> A = A_strip.M; Mat<eT> A = A_strip.M;
arma_debug_check( (A.is_square() == false), "inv(): given matrix is not square" ); arma_debug_check( (A.is_square() == false), "inv(): given matrix is not square" );
const unwrap_check<T2> B_tmp(X.B, out); const unwrap_check<T2> B_tmp(X.B, out);
const Mat<eT>& B = B_tmp.M; const Mat<eT>& B = B_tmp.M;
glue_solve::solve_direct( out, A, B, A_strip.slow ); glue_solve::solve_direct( out, A, B, A_strip.slow );
skipping to change at line 222 skipping to change at line 220
} }
template<typename T1, typename T2> template<typename T1, typename T2>
arma_hot arma_hot
inline inline
void void
glue_times::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_t imes>& X) glue_times::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_t imes>& X)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename T1::elem_type eT;
const sword N_mat = 1 + depth_lhs< glue_times, Glue<T1,T2,glue_times> >:: num; const sword N_mat = 1 + depth_lhs< glue_times, Glue<T1,T2,glue_times> >:: num;
arma_extra_debug_print(arma_boost::format("N_mat = %d") % N_mat); arma_extra_debug_print(arma_boost::format("N_mat = %d") % N_mat);
glue_times_redirect<N_mat>::apply(out, X); glue_times_redirect<N_mat>::apply(out, X);
} }
template<typename T1> template<typename T1>
arma_hot arma_hot
inline inline
 End of changes. 2 change blocks. 
4 lines changed or deleted 0 lines changed or added


 op_cx_scalar_meat.hpp   op_cx_scalar_meat.hpp 
// Copyright (C) 2008-2010 NICTA (www.nicta.com.au) // Copyright (C) 2008-2013 NICTA (www.nicta.com.au)
// Copyright (C) 2008-2010 Conrad Sanderson // Copyright (C) 2008-2013 Conrad Sanderson
// //
// This file is part of the Armadillo C++ library. // This file is part of the Armadillo C++ library.
// It is provided without any warranty of fitness // It is provided without any warranty of fitness
// for any purpose. You can redistribute this file // for any purpose. You can redistribute this file
// and/or modify it under the terms of the GNU // and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published // Lesser General Public License (LGPL) as published
// by the Free Software Foundation, either version 3 // by the Free Software Foundation, either version 3
// of the License or (at your option) any later version. // of the License or (at your option) any later version.
// (see http://www.opensource.org/licenses for more info) // (see http://www.opensource.org/licenses for more info)
skipping to change at line 28 skipping to change at line 28
void void
op_cx_scalar_times::apply op_cx_scalar_times::apply
( (
Mat< typename std::complex<typename T1::pod_type> >& out, Mat< typename std::complex<typename T1::pod_type> >& out,
const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _times>& X const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _times>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const Proxy<T1> A(X.m); const Proxy<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols()); const uword n_rows = A.get_n_rows();
const uword n_cols = A.get_n_cols();
out.set_size(n_rows, n_cols);
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) if(Proxy<T1>::prefer_at_accessor == false)
{ {
out_mem[i] = A[i] * k; const uword n_elem = A.get_n_elem();
for(uword i=0; i<n_elem; ++i)
{
out_mem[i] = A[i] * k;
}
}
else
{
for(uword col=0; col < n_cols; ++col)
for(uword row=0; row < n_rows; ++row)
{
*out_mem = A.at(row,col) * k; ++out_mem;
}
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_plus::apply op_cx_scalar_plus::apply
( (
Mat< typename std::complex<typename T1::pod_type> >& out, Mat< typename std::complex<typename T1::pod_type> >& out,
const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _plus>& X const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _plus>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const Proxy<T1> A(X.m); const Proxy<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols()); const uword n_rows = A.get_n_rows();
const uword n_cols = A.get_n_cols();
out.set_size(n_rows, n_cols);
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) if(Proxy<T1>::prefer_at_accessor == false)
{ {
out_mem[i] = A[i] + k; const uword n_elem = A.get_n_elem();
for(uword i=0; i<n_elem; ++i)
{
out_mem[i] = A[i] + k;
}
}
else
{
for(uword col=0; col < n_cols; ++col)
for(uword row=0; row < n_rows; ++row)
{
*out_mem = A.at(row,col) + k; ++out_mem;
}
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_minus_pre::apply op_cx_scalar_minus_pre::apply
( (
Mat< typename std::complex<typename T1::pod_type> >& out, Mat< typename std::complex<typename T1::pod_type> >& out,
const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _minus_pre>& X const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _minus_pre>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const Proxy<T1> A(X.m); const Proxy<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols()); const uword n_rows = A.get_n_rows();
const uword n_cols = A.get_n_cols();
out.set_size(n_rows, n_cols);
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) if(Proxy<T1>::prefer_at_accessor == false)
{ {
out_mem[i] = k - A[i]; const uword n_elem = A.get_n_elem();
for(uword i=0; i<n_elem; ++i)
{
out_mem[i] = k - A[i];
}
}
else
{
for(uword col=0; col < n_cols; ++col)
for(uword row=0; row < n_rows; ++row)
{
*out_mem = k - A.at(row,col); ++out_mem;
}
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_minus_post::apply op_cx_scalar_minus_post::apply
( (
Mat< typename std::complex<typename T1::pod_type> >& out, Mat< typename std::complex<typename T1::pod_type> >& out,
const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _minus_post>& X const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _minus_post>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const Proxy<T1> A(X.m); const Proxy<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols()); const uword n_rows = A.get_n_rows();
const uword n_cols = A.get_n_cols();
out.set_size(n_rows, n_cols);
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) if(Proxy<T1>::prefer_at_accessor == false)
{ {
out_mem[i] = A[i] - k; const uword n_elem = A.get_n_elem();
for(uword i=0; i<n_elem; ++i)
{
out_mem[i] = A[i] - k;
}
}
else
{
for(uword col=0; col < n_cols; ++col)
for(uword row=0; row < n_rows; ++row)
{
*out_mem = A.at(row,col) - k; ++out_mem;
}
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_div_pre::apply op_cx_scalar_div_pre::apply
( (
Mat< typename std::complex<typename T1::pod_type> >& out, Mat< typename std::complex<typename T1::pod_type> >& out,
const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _div_pre>& X const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _div_pre>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const Proxy<T1> A(X.m); const Proxy<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols()); const uword n_rows = A.get_n_rows();
const uword n_cols = A.get_n_cols();
out.set_size(n_rows, n_cols);
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) if(Proxy<T1>::prefer_at_accessor == false)
{ {
out_mem[i] = k / A[i]; const uword n_elem = A.get_n_elem();
for(uword i=0; i<n_elem; ++i)
{
out_mem[i] = k / A[i];
}
}
else
{
for(uword col=0; col < n_cols; ++col)
for(uword row=0; row < n_rows; ++row)
{
*out_mem = k / A.at(row,col); ++out_mem;
}
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_div_post::apply op_cx_scalar_div_post::apply
( (
Mat< typename std::complex<typename T1::pod_type> >& out, Mat< typename std::complex<typename T1::pod_type> >& out,
const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _div_post>& X const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar _div_post>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const Proxy<T1> A(X.m); const Proxy<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols()); const uword n_rows = A.get_n_rows();
const uword n_cols = A.get_n_cols();
out.set_size(n_rows, n_cols);
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) if(Proxy<T1>::prefer_at_accessor == false)
{ {
out_mem[i] = A[i] / k; const uword n_elem = A.get_n_elem();
for(uword i=0; i<n_elem; ++i)
{
out_mem[i] = A[i] / k;
}
}
else
{
for(uword col=0; col < n_cols; ++col)
for(uword row=0; row < n_rows; ++row)
{
*out_mem = A.at(row,col) / k; ++out_mem;
}
} }
} }
// //
// //
// //
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_times::apply op_cx_scalar_times::apply
( (
Cube< typename std::complex<typename T1::pod_type> >& out, Cube< typename std::complex<typename T1::pod_type> >& out,
const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_times>& X const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_times>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const ProxyCube<T1> A(X.m); const ProxyCube<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices());
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem; const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
// TODO: implement handling for ProxyCube<T1>::prefer_at_accessor == true
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
out_mem[i] = A[i] * k; out_mem[i] = A[i] * k;
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_plus::apply op_cx_scalar_plus::apply
( (
Cube< typename std::complex<typename T1::pod_type> >& out, Cube< typename std::complex<typename T1::pod_type> >& out,
const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_plus>& X const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_plus>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const ProxyCube<T1> A(X.m); const ProxyCube<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices());
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem; const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
out_mem[i] = A[i] + k; out_mem[i] = A[i] + k;
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_minus_pre::apply op_cx_scalar_minus_pre::apply
( (
Cube< typename std::complex<typename T1::pod_type> >& out, Cube< typename std::complex<typename T1::pod_type> >& out,
const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_minus_pre>& X const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_minus_pre>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const ProxyCube<T1> A(X.m); const ProxyCube<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices());
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem; const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
out_mem[i] = k - A[i]; out_mem[i] = k - A[i];
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_minus_post::apply op_cx_scalar_minus_post::apply
( (
Cube< typename std::complex<typename T1::pod_type> >& out, Cube< typename std::complex<typename T1::pod_type> >& out,
const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_minus_post>& X const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_minus_post>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const ProxyCube<T1> A(X.m); const ProxyCube<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices());
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem; const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
out_mem[i] = A[i] - k; out_mem[i] = A[i] - k;
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_div_pre::apply op_cx_scalar_div_pre::apply
( (
Cube< typename std::complex<typename T1::pod_type> >& out, Cube< typename std::complex<typename T1::pod_type> >& out,
const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_div_pre>& X const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_div_pre>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const ProxyCube<T1> A(X.m); const ProxyCube<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices());
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem; const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
out_mem[i] = k / A[i]; out_mem[i] = k / A[i];
} }
} }
template<typename T1> template<typename T1>
inline inline
void void
op_cx_scalar_div_post::apply op_cx_scalar_div_post::apply
( (
Cube< typename std::complex<typename T1::pod_type> >& out, Cube< typename std::complex<typename T1::pod_type> >& out,
const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_div_post>& X const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_sc alar_div_post>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<typename T1::pod_type> eT; typedef typename std::complex<typename T1::pod_type> eT;
typedef typename T1::pod_type T;
const ProxyCube<T1> A(X.m); const ProxyCube<T1> A(X.m);
out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); out.set_size(A.get_n_rows(), A.get_n_cols(), A.get_n_slices());
const eT k = X.aux_out_eT; const eT k = X.aux_out_eT;
const uword n_elem = out.n_elem; const uword n_elem = out.n_elem;
eT* out_mem = out.memptr(); eT* out_mem = out.memptr();
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
out_mem[i] = A[i] / k; out_mem[i] = A[i] / k;
} }
} }
//! @} //! @}
 End of changes. 50 change blocks. 
50 lines changed or deleted 129 lines changed or added


 op_dot_meat.hpp   op_dot_meat.hpp 
skipping to change at line 301 skipping to change at line 301
arma_debug_check( (N != PB.get_n_elem()), "dot(): objects must have the same number of elements" ); arma_debug_check( (N != PB.get_n_elem()), "dot(): objects must have the same number of elements" );
ea_type1 A = PA.get_ea(); ea_type1 A = PA.get_ea();
ea_type2 B = PB.get_ea(); ea_type2 B = PB.get_ea();
T val_real = T(0); T val_real = T(0);
T val_imag = T(0); T val_imag = T(0);
for(uword i=0; i<N; ++i) for(uword i=0; i<N; ++i)
{ {
const std::complex<T> X = A[i]; const std::complex<T> xx = A[i];
const std::complex<T> Y = B[i]; const std::complex<T> yy = B[i];
const T a = X.real(); const T a = xx.real();
const T b = X.imag(); const T b = xx.imag();
const T c = Y.real(); const T c = yy.real();
const T d = Y.imag(); const T d = yy.imag();
val_real += (a*c) - (b*d); val_real += (a*c) - (b*d);
val_imag += (a*d) + (b*c); val_imag += (a*d) + (b*c);
} }
return std::complex<T>(val_real, val_imag); return std::complex<T>(val_real, val_imag);
} }
else else
{ {
return op_dot::apply_unwrap(X,Y); return op_dot::apply_unwrap(X,Y);
 End of changes. 3 change blocks. 
6 lines changed or deleted 6 lines changed or added


 op_find_meat.hpp   op_find_meat.hpp 
// Copyright (C) 2010 NICTA (www.nicta.com.au) // Copyright (C) 2010-2013 NICTA (www.nicta.com.au)
// Copyright (C) 2010 Conrad Sanderson // Copyright (C) 2010-2013 Conrad Sanderson
// Copyright (C) 2010 Dimitrios Bouzas // Copyright (C) 2010 Dimitrios Bouzas
// //
// This file is part of the Armadillo C++ library. // This file is part of the Armadillo C++ library.
// It is provided without any warranty of fitness // It is provided without any warranty of fitness
// for any purpose. You can redistribute this file // for any purpose. You can redistribute this file
// and/or modify it under the terms of the GNU // and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published // Lesser General Public License (LGPL) as published
// by the Free Software Foundation, either version 3 // by the Free Software Foundation, either version 3
// of the License or (at your option) any later version. // of the License or (at your option) any later version.
// (see http://www.opensource.org/licenses for more info) // (see http://www.opensource.org/licenses for more info)
skipping to change at line 28 skipping to change at line 28
inline inline
uword uword
op_find::helper op_find::helper
( (
Mat<uword>& indices, Mat<uword>& indices,
const Base<typename T1::elem_type, T1>& X const Base<typename T1::elem_type, T1>& X
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename T1::elem_type eT; typedef typename T1::elem_type eT;
typedef typename Proxy<T1>::ea_type ea_type;
const Proxy<T1> A(X.get_ref()); const Proxy<T1> A(X.get_ref());
ea_type PA = A.get_ea();
const uword n_elem = A.get_n_elem(); const uword n_elem = A.get_n_elem();
indices.set_size(n_elem, 1); indices.set_size(n_elem, 1);
uword* indices_mem = indices.memptr(); uword* indices_mem = indices.memptr();
uword n_nz = 0; uword n_nz = 0;
for(uword i=0; i<n_elem; ++i) if(Proxy<T1>::prefer_at_accessor == false)
{ {
if(PA[i] != eT(0)) typename Proxy<T1>::ea_type PA = A.get_ea();
for(uword i=0; i<n_elem; ++i)
{
if(PA[i] != eT(0)) { indices_mem[n_nz] = i; ++n_nz; }
}
}
else
{
const uword n_rows = A.get_n_rows();
const uword n_cols = A.get_n_cols();
uword i = 0;
for(uword col=0; col < n_cols; ++col)
for(uword row=0; row < n_rows; ++row)
{ {
indices_mem[n_nz] = i; if(A.at(row,col) != eT(0)) { indices_mem[n_nz] = i; ++n_nz; }
++n_nz;
++i;
} }
} }
return n_nz; return n_nz;
} }
template<typename T1, typename op_type> template<typename T1, typename op_type>
inline inline
uword uword
op_find::helper op_find::helper
skipping to change at line 68 skipping to change at line 82
Mat<uword>& indices, Mat<uword>& indices,
const mtOp<uword, T1, op_type>& X, const mtOp<uword, T1, op_type>& X,
const typename arma_op_rel_only<op_type>::result junk1, const typename arma_op_rel_only<op_type>::result junk1,
const typename arma_not_cx<typename T1::elem_type>::result junk2 const typename arma_not_cx<typename T1::elem_type>::result junk2
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
arma_ignore(junk1); arma_ignore(junk1);
arma_ignore(junk2); arma_ignore(junk2);
typedef typename T1::elem_type eT; typedef typename T1::elem_type eT;
typedef typename Proxy<T1>::ea_type ea_type;
const eT val = X.aux; const eT val = X.aux;
const Proxy<T1> A(X.m); const Proxy<T1> A(X.m);
ea_type PA = A.get_ea();
const uword n_elem = A.get_n_elem(); const uword n_elem = A.get_n_elem();
indices.set_size(n_elem, 1); indices.set_size(n_elem, 1);
uword* indices_mem = indices.memptr(); uword* indices_mem = indices.memptr();
uword n_nz = 0; uword n_nz = 0;
for(uword i=0; i<n_elem; ++i) if(Proxy<T1>::prefer_at_accessor == false)
{ {
const eT tmp = PA[i]; typename Proxy<T1>::ea_type PA = A.get_ea();
bool not_zero; uword i,j;
for(i=0, j=1; j < n_elem; i+=2, j+=2)
{
const eT tpi = PA[i];
const eT tpj = PA[j];
if(is_same_type<op_type, op_rel_lt_pre >::value == true) { not_ bool not_zero_i;
zero = (val < tmp); } bool not_zero_j;
else if(is_same_type<op_type, op_rel_lt_post >::value == true) { not_
zero = (tmp < val); } if(is_same_type<op_type, op_rel_lt_pre >::value == true) { no
else if(is_same_type<op_type, op_rel_gt_pre >::value == true) { not_ t_zero_i = (val < tpi); }
zero = (val > tmp); } else if(is_same_type<op_type, op_rel_lt_post >::value == true) { no
else if(is_same_type<op_type, op_rel_gt_post >::value == true) { not_ t_zero_i = (tpi < val); }
zero = (tmp > val); } else if(is_same_type<op_type, op_rel_gt_pre >::value == true) { no
else if(is_same_type<op_type, op_rel_lteq_pre >::value == true) { not_ t_zero_i = (val > tpi); }
zero = (val <= tmp); } else if(is_same_type<op_type, op_rel_gt_post >::value == true) { no
else if(is_same_type<op_type, op_rel_lteq_post>::value == true) { not_ t_zero_i = (tpi > val); }
zero = (tmp <= val); } else if(is_same_type<op_type, op_rel_lteq_pre >::value == true) { no
else if(is_same_type<op_type, op_rel_gteq_pre >::value == true) { not_ t_zero_i = (val <= tpi); }
zero = (val >= tmp); } else if(is_same_type<op_type, op_rel_lteq_post>::value == true) { no
else if(is_same_type<op_type, op_rel_gteq_post>::value == true) { not_ t_zero_i = (tpi <= val); }
zero = (tmp >= val); } else if(is_same_type<op_type, op_rel_gteq_pre >::value == true) { no
else if(is_same_type<op_type, op_rel_eq >::value == true) { not_ t_zero_i = (val >= tpi); }
zero = (tmp == val); } else if(is_same_type<op_type, op_rel_gteq_post>::value == true) { no
else if(is_same_type<op_type, op_rel_noteq >::value == true) { not_ t_zero_i = (tpi >= val); }
zero = (tmp != val); } else if(is_same_type<op_type, op_rel_eq >::value == true) { no
else not_zero = false; t_zero_i = (tpi == val); }
else if(is_same_type<op_type, op_rel_noteq >::value == true) { no
t_zero_i = (tpi != val); }
else not_zero_i = false;
if(is_same_type<op_type, op_rel_lt_pre >::value == true) { no
t_zero_j = (val < tpj); }
else if(is_same_type<op_type, op_rel_lt_post >::value == true) { no
t_zero_j = (tpj < val); }
else if(is_same_type<op_type, op_rel_gt_pre >::value == true) { no
t_zero_j = (val > tpj); }
else if(is_same_type<op_type, op_rel_gt_post >::value == true) { no
t_zero_j = (tpj > val); }
else if(is_same_type<op_type, op_rel_lteq_pre >::value == true) { no
t_zero_j = (val <= tpj); }
else if(is_same_type<op_type, op_rel_lteq_post>::value == true) { no
t_zero_j = (tpj <= val); }
else if(is_same_type<op_type, op_rel_gteq_pre >::value == true) { no
t_zero_j = (val >= tpj); }
else if(is_same_type<op_type, op_rel_gteq_post>::value == true) { no
t_zero_j = (tpj >= val); }
else if(is_same_type<op_type, op_rel_eq >::value == true) { no
t_zero_j = (tpj == val); }
else if(is_same_type<op_type, op_rel_noteq >::value == true) { no
t_zero_j = (tpj != val); }
else not_zero_j = false;
if(not_zero_i == true) { indices_mem[n_nz] = i; ++n_nz; }
if(not_zero_j == true) { indices_mem[n_nz] = j; ++n_nz; }
}
if(not_zero == true) if(i < n_elem)
{ {
indices_mem[n_nz] = i; bool not_zero;
++n_nz;
const eT tmp = PA[i];
if(is_same_type<op_type, op_rel_lt_pre >::value == true) { no
t_zero = (val < tmp); }
else if(is_same_type<op_type, op_rel_lt_post >::value == true) { no
t_zero = (tmp < val); }
else if(is_same_type<op_type, op_rel_gt_pre >::value == true) { no
t_zero = (val > tmp); }
else if(is_same_type<op_type, op_rel_gt_post >::value == true) { no
t_zero = (tmp > val); }
else if(is_same_type<op_type, op_rel_lteq_pre >::value == true) { no
t_zero = (val <= tmp); }
else if(is_same_type<op_type, op_rel_lteq_post>::value == true) { no
t_zero = (tmp <= val); }
else if(is_same_type<op_type, op_rel_gteq_pre >::value == true) { no
t_zero = (val >= tmp); }
else if(is_same_type<op_type, op_rel_gteq_post>::value == true) { no
t_zero = (tmp >= val); }
else if(is_same_type<op_type, op_rel_eq >::value == true) { no
t_zero = (tmp == val); }
else if(is_same_type<op_type, op_rel_noteq >::value == true) { no
t_zero = (tmp != val); }
else not_zero = false;
if(not_zero == true) { indices_mem[n_nz] = i; ++n_nz; }
}
}
else
{
const uword n_rows = A.get_n_rows();
const uword n_cols = A.get_n_cols();
uword i = 0;
for(uword col=0; col < n_cols; ++col)
for(uword row=0; row < n_rows; ++row)
{
const eT tmp = A.at(row,col);
bool not_zero;
if(is_same_type<op_type, op_rel_lt_pre >::value == true) { no
t_zero = (val < tmp); }
else if(is_same_type<op_type, op_rel_lt_post >::value == true) { no
t_zero = (tmp < val); }
else if(is_same_type<op_type, op_rel_gt_pre >::value == true) { no
t_zero = (val > tmp); }
else if(is_same_type<op_type, op_rel_gt_post >::value == true) { no
t_zero = (tmp > val); }
else if(is_same_type<op_type, op_rel_lteq_pre >::value == true) { no
t_zero = (val <= tmp); }
else if(is_same_type<op_type, op_rel_lteq_post>::value == true) { no
t_zero = (tmp <= val); }
else if(is_same_type<op_type, op_rel_gteq_pre >::value == true) { no
t_zero = (val >= tmp); }
else if(is_same_type<op_type, op_rel_gteq_post>::value == true) { no
t_zero = (tmp >= val); }
else if(is_same_type<op_type, op_rel_eq >::value == true) { no
t_zero = (tmp == val); }
else if(is_same_type<op_type, op_rel_noteq >::value == true) { no
t_zero = (tmp != val); }
else not_zero = false;
if(not_zero == true) { indices_mem[n_nz] = i; ++n_nz; }
++i;
} }
} }
return n_nz; return n_nz;
} }
template<typename T1, typename op_type> template<typename T1, typename op_type>
inline inline
uword uword
op_find::helper op_find::helper
skipping to change at line 133 skipping to change at line 214
arma_ignore(junk1); arma_ignore(junk1);
arma_ignore(junk2); arma_ignore(junk2);
typedef typename T1::elem_type eT; typedef typename T1::elem_type eT;
typedef typename Proxy<T1>::ea_type ea_type; typedef typename Proxy<T1>::ea_type ea_type;
const eT val = X.aux; const eT val = X.aux;
const Proxy<T1> A(X.m); const Proxy<T1> A(X.m);
ea_type PA = A.get_ea(); ea_type PA = A.get_ea();
const uword n_elem = A.get_n_elem(); const uword n_elem = A.get_n_elem();
indices.set_size(n_elem, 1); indices.set_size(n_elem, 1);
uword* indices_mem = indices.memptr(); uword* indices_mem = indices.memptr();
uword n_nz = 0; uword n_nz = 0;
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
const eT tmp = PA[i]; const eT tmp = PA[i];
bool not_zero; bool not_zero;
if(is_same_type<op_type, op_rel_eq >::value == true) { not_zero = (tmp == val); } if(is_same_type<op_type, op_rel_eq >::value == true) { not_zero = (tmp == val); }
else if(is_same_type<op_type, op_rel_noteq>::value == true) { not_zero = (tmp != val); } else if(is_same_type<op_type, op_rel_noteq>::value == true) { not_zero = (tmp != val); }
else not_zero = false; else not_zero = false;
if(not_zero == true) if(not_zero == true) { indices_mem[n_nz] = i; ++n_nz; }
{
indices_mem[n_nz] = i;
++n_nz;
}
} }
return n_nz; return n_nz;
} }
template<typename T1, typename T2, typename glue_type> template<typename T1, typename T2, typename glue_type>
inline inline
uword uword
op_find::helper op_find::helper
( (
skipping to change at line 189 skipping to change at line 266
typedef typename T2::elem_type eT2; typedef typename T2::elem_type eT2;
typedef typename Proxy<T1>::ea_type ea_type1; typedef typename Proxy<T1>::ea_type ea_type1;
typedef typename Proxy<T2>::ea_type ea_type2; typedef typename Proxy<T2>::ea_type ea_type2;
const Proxy<T1> A(X.A); const Proxy<T1> A(X.A);
const Proxy<T2> B(X.B); const Proxy<T2> B(X.B);
arma_debug_assert_same_size(A, B, "relational operator"); arma_debug_assert_same_size(A, B, "relational operator");
ea_type1 PA = A.get_ea(); ea_type1 PA = A.get_ea();
ea_type2 PB = B.get_ea(); ea_type2 PB = B.get_ea();
const uword n_elem = B.get_n_elem(); const uword n_elem = B.get_n_elem();
indices.set_size(n_elem, 1); indices.set_size(n_elem, 1);
uword* indices_mem = indices.memptr(); uword* indices_mem = indices.memptr();
uword n_nz = 0; uword n_nz = 0;
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
const eT1 tmp1 = PA[i]; const eT1 tmp1 = PA[i];
skipping to change at line 213 skipping to change at line 291
bool not_zero; bool not_zero;
if(is_same_type<glue_type, glue_rel_lt >::value == true) { not _zero = (tmp1 < tmp2); } if(is_same_type<glue_type, glue_rel_lt >::value == true) { not _zero = (tmp1 < tmp2); }
else if(is_same_type<glue_type, glue_rel_gt >::value == true) { not _zero = (tmp1 > tmp2); } else if(is_same_type<glue_type, glue_rel_gt >::value == true) { not _zero = (tmp1 > tmp2); }
else if(is_same_type<glue_type, glue_rel_lteq >::value == true) { not _zero = (tmp1 <= tmp2); } else if(is_same_type<glue_type, glue_rel_lteq >::value == true) { not _zero = (tmp1 <= tmp2); }
else if(is_same_type<glue_type, glue_rel_gteq >::value == true) { not _zero = (tmp1 >= tmp2); } else if(is_same_type<glue_type, glue_rel_gteq >::value == true) { not _zero = (tmp1 >= tmp2); }
else if(is_same_type<glue_type, glue_rel_eq >::value == true) { not _zero = (tmp1 == tmp2); } else if(is_same_type<glue_type, glue_rel_eq >::value == true) { not _zero = (tmp1 == tmp2); }
else if(is_same_type<glue_type, glue_rel_noteq >::value == true) { not _zero = (tmp1 != tmp2); } else if(is_same_type<glue_type, glue_rel_noteq >::value == true) { not _zero = (tmp1 != tmp2); }
else not_zero = false; else not_zero = false;
if(not_zero == true) if(not_zero == true) { indices_mem[n_nz] = i; ++n_nz; }
{
indices_mem[n_nz] = i;
++n_nz;
}
} }
return n_nz; return n_nz;
} }
template<typename T1, typename T2, typename glue_type> template<typename T1, typename T2, typename glue_type>
inline inline
uword uword
op_find::helper op_find::helper
( (
skipping to change at line 248 skipping to change at line 322
arma_ignore(junk3); arma_ignore(junk3);
typedef typename Proxy<T1>::ea_type ea_type1; typedef typename Proxy<T1>::ea_type ea_type1;
typedef typename Proxy<T2>::ea_type ea_type2; typedef typename Proxy<T2>::ea_type ea_type2;
const Proxy<T1> A(X.A); const Proxy<T1> A(X.A);
const Proxy<T2> B(X.B); const Proxy<T2> B(X.B);
arma_debug_assert_same_size(A, B, "relational operator"); arma_debug_assert_same_size(A, B, "relational operator");
ea_type1 PA = A.get_ea(); ea_type1 PA = A.get_ea();
ea_type2 PB = B.get_ea(); ea_type2 PB = B.get_ea();
const uword n_elem = B.get_n_elem(); const uword n_elem = B.get_n_elem();
indices.set_size(n_elem, 1); indices.set_size(n_elem, 1);
uword* indices_mem = indices.memptr(); uword* indices_mem = indices.memptr();
uword n_nz = 0; uword n_nz = 0;
for(uword i=0; i<n_elem; ++i) for(uword i=0; i<n_elem; ++i)
{ {
bool not_zero; bool not_zero;
if(is_same_type<glue_type, glue_rel_eq >::value == true) { not _zero = (PA[i] == PB[i]); } if(is_same_type<glue_type, glue_rel_eq >::value == true) { not _zero = (PA[i] == PB[i]); }
else if(is_same_type<glue_type, glue_rel_noteq >::value == true) { not _zero = (PA[i] != PB[i]); } else if(is_same_type<glue_type, glue_rel_noteq >::value == true) { not _zero = (PA[i] != PB[i]); }
else not_zero = false; else not_zero = false;
if(not_zero == true) if(not_zero == true) { indices_mem[n_nz] = i; ++n_nz; }
{
indices_mem[n_nz] = i;
++n_nz;
}
} }
return n_nz; return n_nz;
} }
template<typename T1> template<typename T1>
inline inline
void void
op_find::apply(Mat<uword>& out, const mtOp<uword, T1, op_find>& X) op_find::apply(Mat<uword>& out, const mtOp<uword, T1, op_find>& X)
{ {
skipping to change at line 301 skipping to change at line 372
{ {
out = (k > 0 && k <= n_nz) ? indices.rows(0, k-1 ) : indices.r ows(0, n_nz-1); out = (k > 0 && k <= n_nz) ? indices.rows(0, k-1 ) : indices.r ows(0, n_nz-1);
} }
else // "last" else // "last"
{ {
out = (k > 0 && k <= n_nz) ? indices.rows(n_nz-k, n_nz-1) : indices.r ows(0, n_nz-1); out = (k > 0 && k <= n_nz) ? indices.rows(n_nz-k, n_nz-1) : indices.r ows(0, n_nz-1);
} }
} }
else else
{ {
out.reset(); out.set_size(0,1); // empty column vector
} }
} }
//! @} //! @}
 End of changes. 21 change blocks. 
60 lines changed or deleted 161 lines changed or added


 op_inv_meat.hpp   op_inv_meat.hpp 
skipping to change at line 45 skipping to change at line 45
} }
//! immediate inverse of T1, storing the result in a dense matrix //! immediate inverse of T1, storing the result in a dense matrix
template<typename T1> template<typename T1>
inline inline
void void
op_inv::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv>& X) op_inv::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv>& X)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename T1::elem_type eT;
const strip_diagmat<T1> strip(X.m); const strip_diagmat<T1> strip(X.m);
if(strip.do_diagmat == true) if(strip.do_diagmat == true)
{ {
op_inv::apply_diag(out, strip.M); op_inv::apply_diag(out, strip.M);
} }
else else
{ {
const uword mode = X.aux_uword_a; const uword mode = X.aux_uword_a;
 End of changes. 1 change blocks. 
2 lines changed or deleted 0 lines changed or added


 op_mean_meat.hpp   op_mean_meat.hpp 
skipping to change at line 27 skipping to change at line 27
//! For each row or for each column, find the mean value. //! For each row or for each column, find the mean value.
//! The result is stored in a dense matrix that has either one column or on e row. //! The result is stored in a dense matrix that has either one column or on e row.
//! The dimension, for which the means are found, is set via the mean() fun ction. //! The dimension, for which the means are found, is set via the mean() fun ction.
template<typename T1> template<typename T1>
inline inline
void void
op_mean::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_mean>& in) op_mean::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_mean>& in)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename T1::elem_type eT; typedef typename T1::elem_type eT;
typedef typename get_pod_type<eT>::result T;
const unwrap_check<T1> tmp(in.m, out); const unwrap_check<T1> tmp(in.m, out);
const Mat<eT>& X = tmp.M; const Mat<eT>& X = tmp.M;
const uword dim = in.aux_uword_a; const uword dim = in.aux_uword_a;
arma_debug_check( (dim > 1), "mean(): incorrect usage. dim must be 0 or 1 "); arma_debug_check( (dim > 1), "mean(): incorrect usage. dim must be 0 or 1 ");
const uword X_n_rows = X.n_rows; const uword X_n_rows = X.n_rows;
const uword X_n_cols = X.n_cols; const uword X_n_cols = X.n_cols;
 End of changes. 1 change blocks. 
2 lines changed or deleted 1 lines changed or added


 op_var_meat.hpp   op_var_meat.hpp 
skipping to change at line 105 skipping to change at line 105
return op_var::direct_var(tmp.memptr(), tmp.n_elem, norm_type); return op_var::direct_var(tmp.memptr(), tmp.n_elem, norm_type);
} }
template<typename eT> template<typename eT>
inline inline
typename get_pod_type<eT>::result typename get_pod_type<eT>::result
op_var::var_vec(const subview_col<eT>& X, const uword norm_type) op_var::var_vec(const subview_col<eT>& X, const uword norm_type)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename get_pod_type<eT>::result T;
arma_debug_check( (norm_type > 1), "var(): incorrect usage. norm_type mus t be 0 or 1"); arma_debug_check( (norm_type > 1), "var(): incorrect usage. norm_type mus t be 0 or 1");
return op_var::direct_var(X.colptr(0), X.n_rows, norm_type); return op_var::direct_var(X.colptr(0), X.n_rows, norm_type);
} }
template<typename eT> template<typename eT>
inline inline
typename get_pod_type<eT>::result typename get_pod_type<eT>::result
op_var::var_vec(const subview_row<eT>& X, const uword norm_type) op_var::var_vec(const subview_row<eT>& X, const uword norm_type)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename get_pod_type<eT>::result T;
arma_debug_check( (norm_type > 1), "var(): incorrect usage. norm_type mus t be 0 or 1"); arma_debug_check( (norm_type > 1), "var(): incorrect usage. norm_type mus t be 0 or 1");
const Mat<eT>& A = X.m; const Mat<eT>& A = X.m;
const uword start_row = X.aux_row1; const uword start_row = X.aux_row1;
const uword start_col = X.aux_col1; const uword start_col = X.aux_col1;
const uword end_col_p1 = start_col + X.n_cols; const uword end_col_p1 = start_col + X.n_cols;
podarray<eT> tmp(X.n_elem); podarray<eT> tmp(X.n_elem);
 End of changes. 2 change blocks. 
4 lines changed or deleted 0 lines changed or added


 running_stat_meat.hpp   running_stat_meat.hpp 
skipping to change at line 335 skipping to change at line 335
} }
//! alter statistics to reflect new sample (version for complex numbers) //! alter statistics to reflect new sample (version for complex numbers)
template<typename T> template<typename T>
inline inline
void void
running_stat_aux::update_stats(running_stat< std::complex<T> >& x, const st d::complex<T>& sample) running_stat_aux::update_stats(running_stat< std::complex<T> >& x, const st d::complex<T>& sample)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename std::complex<T> eT;
const T sample_norm = std::norm(sample); const T sample_norm = std::norm(sample);
const T N = x.counter.value(); const T N = x.counter.value();
if(N > T(0)) if(N > T(0))
{ {
if(sample_norm < x.min_val_norm) if(sample_norm < x.min_val_norm)
{ {
x.min_val_norm = sample_norm; x.min_val_norm = sample_norm;
x.min_val = sample; x.min_val = sample;
} }
 End of changes. 1 change blocks. 
2 lines changed or deleted 0 lines changed or added


 spop_var_meat.hpp   spop_var_meat.hpp 
skipping to change at line 23 skipping to change at line 23
//! \addtogroup spop_var //! \addtogroup spop_var
//! @{ //! @{
template<typename T1> template<typename T1>
inline inline
void void
spop_var::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1 ::pod_type, T1, spop_var>& in) spop_var::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1 ::pod_type, T1, spop_var>& in)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename T1::elem_type in_eT; //typedef typename T1::elem_type in_eT;
typedef typename T1::pod_type out_eT; typedef typename T1::pod_type out_eT;
const uword norm_type = in.aux_uword_a; const uword norm_type = in.aux_uword_a;
const uword dim = in.aux_uword_b; const uword dim = in.aux_uword_b;
arma_debug_check((norm_type > 1), "var(): incorrect usage. norm_type must be 0 or 1"); arma_debug_check((norm_type > 1), "var(): incorrect usage. norm_type must be 0 or 1");
arma_debug_check((dim > 1), "var(): incorrect usage. dim must be 0 or 1"); arma_debug_check((dim > 1), "var(): incorrect usage. dim must be 0 or 1");
SpProxy<T1> p(in.m); SpProxy<T1> p(in.m);
skipping to change at line 62 skipping to change at line 62
( (
SpMat<typename T1::pod_type>& out_ref, SpMat<typename T1::pod_type>& out_ref,
const SpProxy<T1>& p, const SpProxy<T1>& p,
const uword norm_type, const uword norm_type,
const uword dim const uword dim
) )
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
typedef typename T1::elem_type in_eT; typedef typename T1::elem_type in_eT;
typedef typename T1::pod_type out_eT; //typedef typename T1::pod_type out_eT;
const uword p_n_rows = p.get_n_rows(); const uword p_n_rows = p.get_n_rows();
const uword p_n_cols = p.get_n_cols(); const uword p_n_cols = p.get_n_cols();
if(dim == 0) if(dim == 0)
{ {
arma_extra_debug_print("spop_var::apply(), dim = 0"); arma_extra_debug_print("spop_var::apply(), dim = 0");
arma_debug_check((p_n_rows == 0), "var(): given object has zero rows"); arma_debug_check((p_n_rows == 0), "var(): given object has zero rows");
 End of changes. 2 change blocks. 
2 lines changed or deleted 2 lines changed or added


 subview_elem1_meat.hpp   subview_elem1_meat.hpp 
// Copyright (C) 2010-2012 NICTA (www.nicta.com.au) // Copyright (C) 2010-2013 NICTA (www.nicta.com.au)
// Copyright (C) 2010-2012 Conrad Sanderson // Copyright (C) 2010-2013 Conrad Sanderson
// //
// This file is part of the Armadillo C++ library. // This file is part of the Armadillo C++ library.
// It is provided without any warranty of fitness // It is provided without any warranty of fitness
// for any purpose. You can redistribute this file // for any purpose. You can redistribute this file
// and/or modify it under the terms of the GNU // and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published // Lesser General Public License (LGPL) as published
// by the Free Software Foundation, either version 3 // by the Free Software Foundation, either version 3
// of the License or (at your option) any later version. // of the License or (at your option) any later version.
// (see http://www.opensource.org/licenses for more info) // (see http://www.opensource.org/licenses for more info)
skipping to change at line 50 skipping to change at line 50
Mat<eT>& m_local = const_cast< Mat<eT>& >(m); Mat<eT>& m_local = const_cast< Mat<eT>& >(m);
eT* m_mem = m_local.memptr(); eT* m_mem = m_local.memptr();
const uword m_n_elem = m_local.n_elem; const uword m_n_elem = m_local.n_elem;
const unwrap_check_mixed<T1> tmp(a.get_ref(), m_local); const unwrap_check_mixed<T1> tmp(a.get_ref(), m_local);
const umat& aa = tmp.M; const umat& aa = tmp.M;
arma_debug_check arma_debug_check
( (
( aa.is_vec() == false ), ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* aa_mem = aa.memptr(); const uword* aa_mem = aa.memptr();
const uword aa_n_elem = aa.n_elem; const uword aa_n_elem = aa.n_elem;
uword iq,jq; uword iq,jq;
for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)
{ {
const uword ii = aa_mem[iq]; const uword ii = aa_mem[iq];
skipping to change at line 121 skipping to change at line 121
const Mat<eT>& x_m_local = x.m; const Mat<eT>& x_m_local = x.m;
const unwrap_check_mixed<T1> s_tmp(s.a.get_ref(), s_m_local); const unwrap_check_mixed<T1> s_tmp(s.a.get_ref(), s_m_local);
const unwrap_check_mixed<T2> x_tmp(x.a.get_ref(), s_m_local); const unwrap_check_mixed<T2> x_tmp(x.a.get_ref(), s_m_local);
const umat& s_aa = s_tmp.M; const umat& s_aa = s_tmp.M;
const umat& x_aa = x_tmp.M; const umat& x_aa = x_tmp.M;
arma_debug_check arma_debug_check
( (
( (s_aa.is_vec() == false) || (x_aa.is_vec() == false) ), ( ((s_aa.is_vec() == false) && (s_aa.is_empty() == false)) || ((x_aa. is_vec() == false) && (x_aa.is_empty() == false)) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* s_aa_mem = s_aa.memptr(); const uword* s_aa_mem = s_aa.memptr();
const uword* x_aa_mem = x_aa.memptr(); const uword* x_aa_mem = x_aa.memptr();
const uword s_aa_n_elem = s_aa.n_elem; const uword s_aa_n_elem = s_aa.n_elem;
arma_debug_check( (s_aa_n_elem != x_aa.n_elem), "Mat::elem(): size mism atch" ); arma_debug_check( (s_aa_n_elem != x_aa.n_elem), "Mat::elem(): size mism atch" );
skipping to change at line 198 skipping to change at line 198
Mat<eT>& m_local = const_cast< Mat<eT>& >(m); Mat<eT>& m_local = const_cast< Mat<eT>& >(m);
eT* m_mem = m_local.memptr(); eT* m_mem = m_local.memptr();
const uword m_n_elem = m_local.n_elem; const uword m_n_elem = m_local.n_elem;
const unwrap_check_mixed<T1> aa_tmp(a.get_ref(), m_local); const unwrap_check_mixed<T1> aa_tmp(a.get_ref(), m_local);
const umat& aa = aa_tmp.M; const umat& aa = aa_tmp.M;
arma_debug_check arma_debug_check
( (
( aa.is_vec() == false ), ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* aa_mem = aa.memptr(); const uword* aa_mem = aa.memptr();
const uword aa_n_elem = aa.n_elem; const uword aa_n_elem = aa.n_elem;
const Proxy<T2> P(x.get_ref()); const Proxy<T2> P(x.get_ref());
arma_debug_check( (aa_n_elem != P.get_n_elem()), "Mat::elem(): size misma tch" ); arma_debug_check( (aa_n_elem != P.get_n_elem()), "Mat::elem(): size misma tch" );
skipping to change at line 529 skipping to change at line 529
void void
subview_elem1<eT,T1>::extract(Mat<eT>& actual_out, const subview_elem1<eT,T 1>& in) subview_elem1<eT,T1>::extract(Mat<eT>& actual_out, const subview_elem1<eT,T 1>& in)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
const unwrap_check_mixed<T1> tmp1(in.a.get_ref(), actual_out); const unwrap_check_mixed<T1> tmp1(in.a.get_ref(), actual_out);
const umat& aa = tmp1.M; const umat& aa = tmp1.M;
arma_debug_check arma_debug_check
( (
( aa.is_vec() == false ), ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* aa_mem = aa.memptr(); const uword* aa_mem = aa.memptr();
const uword aa_n_elem = aa.n_elem; const uword aa_n_elem = aa.n_elem;
const Mat<eT>& m_local = in.m; const Mat<eT>& m_local = in.m;
const eT* m_mem = m_local.memptr(); const eT* m_mem = m_local.memptr();
const uword m_n_elem = m_local.n_elem; const uword m_n_elem = m_local.n_elem;
skipping to change at line 593 skipping to change at line 593
void void
subview_elem1<eT,T1>::mat_inplace_op(Mat<eT>& out, const subview_elem1& in) subview_elem1<eT,T1>::mat_inplace_op(Mat<eT>& out, const subview_elem1& in)
{ {
arma_extra_debug_sigprint(); arma_extra_debug_sigprint();
const unwrap<T1> tmp1(in.a.get_ref()); const unwrap<T1> tmp1(in.a.get_ref());
const umat& aa = tmp1.M; const umat& aa = tmp1.M;
arma_debug_check arma_debug_check
( (
( aa.is_vec() == false ), ( (aa.is_vec() == false) && (aa.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* aa_mem = aa.memptr(); const uword* aa_mem = aa.memptr();
const uword aa_n_elem = aa.n_elem; const uword aa_n_elem = aa.n_elem;
const unwrap_check< Mat<eT> > tmp2(in.m, out); const unwrap_check< Mat<eT> > tmp2(in.m, out);
const Mat<eT>& m_local = tmp2.M; const Mat<eT>& m_local = tmp2.M;
const eT* m_mem = m_local.memptr(); const eT* m_mem = m_local.memptr();
 End of changes. 6 change blocks. 
7 lines changed or deleted 7 lines changed or added


 subview_elem2_meat.hpp   subview_elem2_meat.hpp 
// Copyright (C) 2012 NICTA (www.nicta.com.au) // Copyright (C) 2012-2013 NICTA (www.nicta.com.au)
// Copyright (C) 2012 Conrad Sanderson // Copyright (C) 2012-2013 Conrad Sanderson
// //
// This file is part of the Armadillo C++ library. // This file is part of the Armadillo C++ library.
// It is provided without any warranty of fitness // It is provided without any warranty of fitness
// for any purpose. You can redistribute this file // for any purpose. You can redistribute this file
// and/or modify it under the terms of the GNU // and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published // Lesser General Public License (LGPL) as published
// by the Free Software Foundation, either version 3 // by the Free Software Foundation, either version 3
// of the License or (at your option) any later version. // of the License or (at your option) any later version.
// (see http://www.opensource.org/licenses for more info) // (see http://www.opensource.org/licenses for more info)
skipping to change at line 65 skipping to change at line 65
if( (all_rows == false) && (all_cols == false) ) if( (all_rows == false) && (all_cols == false) )
{ {
const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local); const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);
const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local); const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);
const umat& ri = tmp1.M; const umat& ri = tmp1.M;
const umat& ci = tmp2.M; const umat& ci = tmp2.M;
arma_debug_check arma_debug_check
( (
( ri.is_vec() == false ) || ( ci.is_vec() == false ), ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec () == false) && (ci.is_empty() == false)) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ri_mem = ri.memptr(); const uword* ri_mem = ri.memptr();
const uword ri_n_elem = ri.n_elem; const uword ri_n_elem = ri.n_elem;
const uword* ci_mem = ci.memptr(); const uword* ci_mem = ci.memptr();
const uword ci_n_elem = ci.n_elem; const uword ci_n_elem = ci.n_elem;
for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
skipping to change at line 104 skipping to change at line 104
} }
else else
if( (all_rows == true) && (all_cols == false) ) if( (all_rows == true) && (all_cols == false) )
{ {
const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local); const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);
const umat& ci = tmp2.M; const umat& ci = tmp2.M;
arma_debug_check arma_debug_check
( (
( ci.is_vec() == false ), ( (ci.is_vec() == false) && (ci.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ci_mem = ci.memptr(); const uword* ci_mem = ci.memptr();
const uword ci_n_elem = ci.n_elem; const uword ci_n_elem = ci.n_elem;
for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
{ {
const uword col = ci_mem[ci_count]; const uword col = ci_mem[ci_count];
skipping to change at line 135 skipping to change at line 135
} }
else else
if( (all_rows == false) && (all_cols == true) ) if( (all_rows == false) && (all_cols == true) )
{ {
const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local); const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);
const umat& ri = tmp1.M; const umat& ri = tmp1.M;
arma_debug_check arma_debug_check
( (
( ri.is_vec() == false ), ( (ri.is_vec() == false) && (ri.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ri_mem = ri.memptr(); const uword* ri_mem = ri.memptr();
const uword ri_n_elem = ri.n_elem; const uword ri_n_elem = ri.n_elem;
for(uword col=0; col < m_n_cols; ++col) for(uword col=0; col < m_n_cols; ++col)
{ {
for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)
{ {
skipping to change at line 186 skipping to change at line 186
if( (all_rows == false) && (all_cols == false) ) if( (all_rows == false) && (all_cols == false) )
{ {
const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local); const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);
const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local); const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);
const umat& ri = tmp1.M; const umat& ri = tmp1.M;
const umat& ci = tmp2.M; const umat& ci = tmp2.M;
arma_debug_check arma_debug_check
( (
( ri.is_vec() == false ) || ( ci.is_vec() == false ), ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec () == false) && (ci.is_empty() == false)) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ri_mem = ri.memptr(); const uword* ri_mem = ri.memptr();
const uword ri_n_elem = ri.n_elem; const uword ri_n_elem = ri.n_elem;
const uword* ci_mem = ci.memptr(); const uword* ci_mem = ci.memptr();
const uword ci_n_elem = ci.n_elem; const uword ci_n_elem = ci.n_elem;
arma_debug_assert_same_size( ri_n_elem, ci_n_elem, X.n_rows, X.n_cols, "Mat::elem()" ); arma_debug_assert_same_size( ri_n_elem, ci_n_elem, X.n_rows, X.n_cols, "Mat::elem()" );
skipping to change at line 227 skipping to change at line 227
} }
else else
if( (all_rows == true) && (all_cols == false) ) if( (all_rows == true) && (all_cols == false) )
{ {
const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local); const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);
const umat& ci = tmp2.M; const umat& ci = tmp2.M;
arma_debug_check arma_debug_check
( (
( ci.is_vec() == false ), ( (ci.is_vec() == false) && (ci.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ci_mem = ci.memptr(); const uword* ci_mem = ci.memptr();
const uword ci_n_elem = ci.n_elem; const uword ci_n_elem = ci.n_elem;
arma_debug_assert_same_size( m_n_rows, ci_n_elem, X.n_rows, X.n_cols, " Mat::elem()" ); arma_debug_assert_same_size( m_n_rows, ci_n_elem, X.n_rows, X.n_cols, " Mat::elem()" );
for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
{ {
skipping to change at line 261 skipping to change at line 261
} }
else else
if( (all_rows == false) && (all_cols == true) ) if( (all_rows == false) && (all_cols == true) )
{ {
const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local); const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);
const umat& ri = tmp1.M; const umat& ri = tmp1.M;
arma_debug_check arma_debug_check
( (
( ri.is_vec() == false ), ( (ri.is_vec() == false) && (ri.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ri_mem = ri.memptr(); const uword* ri_mem = ri.memptr();
const uword ri_n_elem = ri.n_elem; const uword ri_n_elem = ri.n_elem;
arma_debug_assert_same_size( ri_n_elem, m_n_cols, X.n_rows, X.n_cols, " Mat::elem()" ); arma_debug_assert_same_size( ri_n_elem, m_n_cols, X.n_rows, X.n_cols, " Mat::elem()" );
for(uword col=0; col < m_n_cols; ++col) for(uword col=0; col < m_n_cols; ++col)
{ {
skipping to change at line 528 skipping to change at line 528
if( (in.all_rows == false) && (in.all_cols == false) ) if( (in.all_rows == false) && (in.all_cols == false) )
{ {
const unwrap_check_mixed<T1> tmp1(in.base_ri.get_ref(), actual_out); const unwrap_check_mixed<T1> tmp1(in.base_ri.get_ref(), actual_out);
const unwrap_check_mixed<T2> tmp2(in.base_ci.get_ref(), actual_out); const unwrap_check_mixed<T2> tmp2(in.base_ci.get_ref(), actual_out);
const umat& ri = tmp1.M; const umat& ri = tmp1.M;
const umat& ci = tmp2.M; const umat& ci = tmp2.M;
arma_debug_check arma_debug_check
( (
( ri.is_vec() == false ) || ( ci.is_vec() == false ), ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec () == false) && (ci.is_empty() == false)) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ri_mem = ri.memptr(); const uword* ri_mem = ri.memptr();
const uword ri_n_elem = ri.n_elem; const uword ri_n_elem = ri.n_elem;
const uword* ci_mem = ci.memptr(); const uword* ci_mem = ci.memptr();
const uword ci_n_elem = ci.n_elem; const uword ci_n_elem = ci.n_elem;
out.set_size(ri_n_elem, ci_n_elem); out.set_size(ri_n_elem, ci_n_elem);
skipping to change at line 569 skipping to change at line 569
} }
else else
if( (in.all_rows == true) && (in.all_cols == false) ) if( (in.all_rows == true) && (in.all_cols == false) )
{ {
const unwrap_check_mixed<T2> tmp2(in.base_ci.get_ref(), m_local); const unwrap_check_mixed<T2> tmp2(in.base_ci.get_ref(), m_local);
const umat& ci = tmp2.M; const umat& ci = tmp2.M;
arma_debug_check arma_debug_check
( (
( ci.is_vec() == false ), ( (ci.is_vec() == false) && (ci.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ci_mem = ci.memptr(); const uword* ci_mem = ci.memptr();
const uword ci_n_elem = ci.n_elem; const uword ci_n_elem = ci.n_elem;
out.set_size(m_n_rows, ci_n_elem); out.set_size(m_n_rows, ci_n_elem);
for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)
{ {
skipping to change at line 596 skipping to change at line 596
} }
else else
if( (in.all_rows == false) && (in.all_cols == true) ) if( (in.all_rows == false) && (in.all_cols == true) )
{ {
const unwrap_check_mixed<T1> tmp1(in.base_ri.get_ref(), m_local); const unwrap_check_mixed<T1> tmp1(in.base_ri.get_ref(), m_local);
const umat& ri = tmp1.M; const umat& ri = tmp1.M;
arma_debug_check arma_debug_check
( (
( ri.is_vec() == false ), ( (ri.is_vec() == false) && (ri.is_empty() == false) ),
"Mat::elem(): given object is not a vector" "Mat::elem(): given object is not a vector"
); );
const uword* ri_mem = ri.memptr(); const uword* ri_mem = ri.memptr();
const uword ri_n_elem = ri.n_elem; const uword ri_n_elem = ri.n_elem;
out.set_size(ri_n_elem, m_n_cols); out.set_size(ri_n_elem, m_n_cols);
for(uword col=0; col < m_n_cols; ++col) for(uword col=0; col < m_n_cols; ++col)
{ {
 End of changes. 10 change blocks. 
11 lines changed or deleted 11 lines changed or added


 unwrap.hpp   unwrap.hpp 
skipping to change at line 1167 skipping to change at line 1167
inline eT get_val() const { return val; } inline eT get_val() const { return val; }
static const bool do_trans = false; static const bool do_trans = false;
static const bool do_times = true; static const bool do_times = true;
const eT val; const eT val;
const Mat<eT>& M; const Mat<eT>& M;
}; };
template<typename T1>
struct partial_unwrap_neg_default
{
typedef typename T1::elem_type eT;
inline
partial_unwrap_neg_default(const eOp<T1, eop_neg>& A)
: M(A.P.Q)
{
arma_extra_debug_sigprint();
}
arma_hot arma_inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT> M;
};
template<typename T1>
struct partial_unwrap_neg_fixed
{
typedef typename T1::elem_type eT;
inline explicit
partial_unwrap_neg_fixed(const eOp<T1, eop_neg>& A)
: M(A.P.Q)
{
arma_extra_debug_sigprint();
}
arma_hot arma_inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT>& M;
};
template<typename T1, bool condition>
struct partial_unwrap_neg_redirect {};
template<typename T1>
struct partial_unwrap_neg_redirect<T1, false> { typedef partial_unwrap_neg_
default<T1> result; };
template<typename T1>
struct partial_unwrap_neg_redirect<T1, true> { typedef partial_unwrap_neg_
fixed<T1> result; };
template<typename T1>
struct partial_unwrap< eOp<T1, eop_neg> > : public partial_unwrap_neg_redir
ect<T1, is_Mat_fixed<T1>::value >::result
{
typedef typename T1::elem_type eT;
inline
partial_unwrap(const eOp<T1, eop_neg>& A)
: partial_unwrap_neg_redirect< T1, is_Mat_fixed<T1>::value >::result(A)
{
}
};
template<typename eT>
struct partial_unwrap< eOp<Mat<eT>, eop_neg> >
{
inline
partial_unwrap(const eOp<Mat<eT>,eop_neg>& A)
: M(A.P.Q)
{
arma_extra_debug_sigprint();
}
inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT>& M;
};
template<typename eT>
struct partial_unwrap< eOp<Row<eT>, eop_neg> >
{
inline
partial_unwrap(const eOp<Row<eT>,eop_neg>& A)
: M(A.P.Q)
{
arma_extra_debug_sigprint();
}
inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT>& M;
};
template<typename eT>
struct partial_unwrap< eOp<Col<eT>, eop_neg> >
{
inline
partial_unwrap(const eOp<Col<eT>,eop_neg>& A)
: M(A.P.Q)
{
arma_extra_debug_sigprint();
}
inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT>& M;
};
// //
template<typename T1> template<typename T1>
struct partial_unwrap_check_default struct partial_unwrap_check_default
{ {
typedef typename T1::elem_type eT; typedef typename T1::elem_type eT;
inline inline
partial_unwrap_check_default(const T1& A, const Mat<eT>&) partial_unwrap_check_default(const T1& A, const Mat<eT>&)
: M(A) : M(A)
skipping to change at line 1914 skipping to change at line 2029
static const bool do_trans = false; static const bool do_trans = false;
static const bool do_times = true; static const bool do_times = true;
const eT val; const eT val;
const Mat<eT> M; const Mat<eT> M;
//// prevents the compiler from potentially deleting the subview object b efore we're done with it //// prevents the compiler from potentially deleting the subview object b efore we're done with it
//const eOp<subview_col<eT>,eop_scalar_times>& ref; //const eOp<subview_col<eT>,eop_scalar_times>& ref;
}; };
template<typename T1>
struct partial_unwrap_check_neg_default
{
typedef typename T1::elem_type eT;
inline
partial_unwrap_check_neg_default(const eOp<T1, eop_neg>& A, const Mat<eT>
&)
: M(A.P.Q)
{
arma_extra_debug_sigprint();
}
arma_hot arma_inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT> M;
};
template<typename T1>
struct partial_unwrap_check_neg_fixed
{
typedef typename T1::elem_type eT;
inline explicit
partial_unwrap_check_neg_fixed(const eOp<T1, eop_neg>& A, const Mat<eT>&
B)
: M_local( (&(A.P.Q) == &B) ? new Mat<eT>(A.P.Q) : 0 )
, M ( (&(A.P.Q) == &B) ? (*M_local) : A.P.Q )
{
arma_extra_debug_sigprint();
}
inline
~partial_unwrap_check_neg_fixed()
{
arma_extra_debug_sigprint();
if(M_local) { delete M_local; }
}
arma_hot arma_inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT>* M_local;
const Mat<eT>& M;
};
template<typename T1, bool condition>
struct partial_unwrap_check_neg_redirect {};
template<typename T1>
struct partial_unwrap_check_neg_redirect<T1, false> { typedef partial_unwra
p_check_neg_default<T1> result; };
template<typename T1>
struct partial_unwrap_check_neg_redirect<T1, true> { typedef partial_unwra
p_check_neg_fixed<T1> result; };
template<typename T1>
struct partial_unwrap_check< eOp<T1, eop_neg> > : public partial_unwrap_che
ck_neg_redirect<T1, is_Mat_fixed<T1>::value >::result
{
typedef typename T1::elem_type eT;
inline partial_unwrap_check(const eOp<T1, eop_neg>& A, const Mat<eT>& B)
: partial_unwrap_check_neg_redirect< T1, is_Mat_fixed<T1>::value >::res
ult(A, B)
{
}
};
template<typename eT>
struct partial_unwrap_check< eOp<Mat<eT>, eop_neg> >
{
arma_hot inline
partial_unwrap_check(const eOp<Mat<eT>,eop_neg>& A, const Mat<eT>& B)
: M_local( (&(A.P.Q) == &B) ? new Mat<eT>(A.P.Q) : 0 )
, M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q )
{
arma_extra_debug_sigprint();
}
inline
~partial_unwrap_check()
{
arma_extra_debug_sigprint();
if(M_local) { delete M_local; }
}
arma_hot arma_inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT>* M_local;
const Mat<eT>& M;
};
template<typename eT>
struct partial_unwrap_check< eOp<Row<eT>, eop_neg> >
{
arma_hot inline
partial_unwrap_check(const eOp<Row<eT>,eop_neg>& A, const Mat<eT>& B)
: M_local( (&(A.P.Q) == &B) ? new Mat<eT>(A.P.Q) : 0 )
, M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q )
{
arma_extra_debug_sigprint();
}
inline
~partial_unwrap_check()
{
arma_extra_debug_sigprint();
if(M_local) { delete M_local; }
}
arma_hot arma_inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT>* M_local;
const Mat<eT>& M;
};
template<typename eT>
struct partial_unwrap_check< eOp<Col<eT>, eop_neg> >
{
arma_hot inline
partial_unwrap_check(const eOp<Col<eT>,eop_neg>& A, const Mat<eT>& B)
: M_local( (&(A.P.Q) == &B) ? new Mat<eT>(A.P.Q) : 0 )
, M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q )
{
arma_extra_debug_sigprint();
}
inline
~partial_unwrap_check()
{
arma_extra_debug_sigprint();
if(M_local) { delete M_local; }
}
arma_hot arma_inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT>* M_local;
const Mat<eT>& M;
};
// NOTE: we can get away with this shortcut as the partial_unwrap_check cla
ss is only used by the glue_times class,
// NOTE: which relies on partial_unwrap_check to check for aliasing
template<typename eT>
struct partial_unwrap_check< eOp<subview_col<eT>, eop_neg> >
{
arma_hot inline
partial_unwrap_check(const eOp<subview_col<eT>,eop_neg>& A, const Mat<eT>
& B)
: M ( const_cast<eT*>( A.P.Q.colptr(0) ), A.P.Q.n_rows, 1, (&(A.P.Q.m)
== &B), false )
{
arma_extra_debug_sigprint();
}
arma_hot arma_inline eT get_val() const { return eT(-1); }
static const bool do_trans = false;
static const bool do_times = true;
const Mat<eT> M;
};
//! @} //! @}
 End of changes. 2 change blocks. 
0 lines changed or deleted 301 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/