// N-D Array manipulations. /* Copyright (C) 2004-2015 John W. Eaton Copyright (C) 2009 VZLU Prague, a.s. This file is part of Octave. Octave is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Octave is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Octave; see the file COPYING. If not, see . */ #ifdef HAVE_CONFIG_H #include #endif #include "Array-util.h" #include "mx-base.h" #include "lo-ieee.h" #include "mx-inlines.cc" // unary operations template boolNDArray intNDArray::operator ! (void) const { boolNDArray b (this->dims ()); for (octave_idx_type i = 0; i < this->length (); i++) b.elem (i) = ! this->elem (i); return b; } template bool intNDArray::any_element_not_one_or_zero (void) const { octave_idx_type nel = this->nelem (); for (octave_idx_type i = 0; i < nel; i++) { T val = this->elem (i); if (val != 0.0 && val != 1.0) return true; } return false; } template intNDArray intNDArray::diag (octave_idx_type k) const { return MArray::diag (k); } template intNDArray intNDArray::diag (octave_idx_type m, octave_idx_type n) const { return MArray::diag (m, n); } // FIXME: this is not quite the right thing. template boolNDArray intNDArray::all (int dim) const { return do_mx_red_op (*this, dim, mx_inline_all); } template boolNDArray intNDArray::any (int dim) const { return do_mx_red_op (*this, dim, mx_inline_any); } template void intNDArray::increment_index (Array& ra_idx, const dim_vector& dimensions, int start_dimension) { ::increment_index (ra_idx, dimensions, start_dimension); } template octave_idx_type intNDArray::compute_index (Array& ra_idx, const dim_vector& dimensions) { return ::compute_index (ra_idx, dimensions); } template intNDArray intNDArray::concat (const intNDArray& rb, const Array& ra_idx) { if (rb.numel () > 0) insert (rb, ra_idx); return *this; } template intNDArray& intNDArray::insert (const intNDArray& a, octave_idx_type r, octave_idx_type c) { Array::insert (a, r, c); return *this; } template intNDArray& intNDArray::insert (const intNDArray& a, const Array& ra_idx) { Array::insert (a, ra_idx); return *this; } // This contains no information on the array structure !!! template std::ostream& operator << (std::ostream& os, const intNDArray& a) { octave_idx_type nel = a.nelem (); for (octave_idx_type i = 0; i < nel; i++) os << " " << a.elem (i) << "\n"; return os; } template std::istream& operator >> (std::istream& is, intNDArray& a) { octave_idx_type nel = a.nelem (); if (nel > 0) { T tmp; for (octave_idx_type i = 0; i < nel; i++) { is >> tmp; if (is) a.elem (i) = tmp; else goto done; } } done: return is; } // FIXME: should abs and signum just be mapper functions? template intNDArray intNDArray::abs (void) const { octave_idx_type nel = this->nelem (); intNDArray ret (this->dims ()); for (octave_idx_type i = 0; i < nel; i++) { T val = this->elem (i); ret.xelem (i) = val.abs (); } return ret; } template intNDArray intNDArray::signum (void) const { octave_idx_type nel = this->nelem (); intNDArray ret (this->dims ()); for (octave_idx_type i = 0; i < nel; i++) { T val = this->elem (i); ret.xelem (i) = val.signum (); } return ret; } template intNDArray intNDArray::prod (int dim) const { return do_mx_red_op (*this, dim, mx_inline_prod); } template intNDArray intNDArray::sum (int dim) const { return do_mx_red_op (*this, dim, mx_inline_sum); } template NDArray intNDArray::dsum (int dim) const { return do_mx_red_op (*this, dim, mx_inline_dsum); } template intNDArray intNDArray::cumsum (int dim) const { return do_mx_cum_op (*this, dim, mx_inline_cumsum); } template intNDArray intNDArray::max (int dim) const { return do_mx_minmax_op (*this, dim, mx_inline_max); } template intNDArray intNDArray::max (Array& idx_arg, int dim) const { return do_mx_minmax_op (*this, idx_arg, dim, mx_inline_max); } template intNDArray intNDArray::min (int dim) const { return do_mx_minmax_op (*this, dim, mx_inline_min); } template intNDArray intNDArray::min (Array& idx_arg, int dim) const { return do_mx_minmax_op (*this, idx_arg, dim, mx_inline_min); } template intNDArray intNDArray::cummax (int dim) const { return do_mx_cumminmax_op (*this, dim, mx_inline_cummax); } template intNDArray intNDArray::cummax (Array& idx_arg, int dim) const { return do_mx_cumminmax_op (*this, idx_arg, dim, mx_inline_cummax); } template intNDArray intNDArray::cummin (int dim) const { return do_mx_cumminmax_op (*this, dim, mx_inline_cummin); } template intNDArray intNDArray::cummin (Array& idx_arg, int dim) const { return do_mx_cumminmax_op (*this, idx_arg, dim, mx_inline_cummin); } template intNDArray intNDArray::diff (octave_idx_type order, int dim) const { return do_mx_diff_op (*this, dim, order, mx_inline_diff); }