Mercurial > hg > octave-lyh
view liboctave/MArray.cc @ 9612:66970dd627f6
further liboctave design improvements
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Fri, 04 Sep 2009 11:22:53 +0200 |
parents | 3a1dd361f978 |
children | 47c5af1868df |
line wrap: on
line source
/* Copyright (C) 1993, 1995, 1996, 1997, 2000, 2002, 2003, 2004, 2005, 2007, 2008 John W. Eaton Copyright (C) 2009 VZLU Prague 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 <http://www.gnu.org/licenses/>. */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "MArray.h" #include "Array-util.h" #include "lo-error.h" #include "MArray-defs.h" // One dimensional array with math ops. template <class T> double MArray<T>::norm (double) const { (*current_liboctave_error_handler) ("norm: only implemented for double and complex values"); return 0; } template <class T> float MArray<T>::norm (float) const { (*current_liboctave_error_handler) ("norm: only implemented for double and complex values"); return 0; } template <class T> struct _idxadds_helper { T *array; T val; _idxadds_helper (T *a, T v) : array (a), val (v) { } void operator () (octave_idx_type i) { array[i] += val; } }; template <class T> struct _idxadda_helper { T *array; const T *vals; _idxadda_helper (T *a, const T *v) : array (a), vals (v) { } void operator () (octave_idx_type i) { array[i] += *vals++; } }; template <class T> void MArray<T>::idx_add (const idx_vector& idx, T val) { octave_idx_type n = this->length (); octave_idx_type ext = idx.extent (n); if (ext > n) { this->resize (ext); n = ext; } OCTAVE_QUIT; octave_idx_type len = idx.length (n); idx.loop (len, _idxadds_helper<T> (this->fortran_vec (), val)); } template <class T> void MArray<T>::idx_add (const idx_vector& idx, const MArray<T>& vals) { octave_idx_type n = this->length (); octave_idx_type ext = idx.extent (n); if (ext > n) { this->resize (ext); n = ext; } OCTAVE_QUIT; octave_idx_type len = std::min (idx.length (n), vals.length ()); idx.loop (len, _idxadda_helper<T> (this->fortran_vec (), vals.data ())); } // Element by element MArray by scalar ops. template <class T> MArray<T>& operator += (MArray<T>& a, const T& s) { if (a.is_shared ()) a = a + s; else do_ms_inplace_op<MArray<T>, T> (a, s, mx_inline_add2); return a; } template <class T> MArray<T>& operator -= (MArray<T>& a, const T& s) { if (a.is_shared ()) a = a - s; else do_ms_inplace_op<MArray<T>, T> (a, s, mx_inline_sub2); return a; } template <class T> MArray<T>& operator *= (MArray<T>& a, const T& s) { if (a.is_shared ()) a = a * s; else do_ms_inplace_op<MArray<T>, T> (a, s, mx_inline_mul2); return a; } template <class T> MArray<T>& operator /= (MArray<T>& a, const T& s) { if (a.is_shared ()) a = a / s; else do_ms_inplace_op<MArray<T>, T> (a, s, mx_inline_div2); return a; } // Element by element MArray by MArray ops. template <class T> MArray<T>& operator += (MArray<T>& a, const MArray<T>& b) { if (a.is_shared ()) a = a + b; else do_mm_inplace_op<MArray<T>, MArray<T> > (a, b, mx_inline_add2, "+="); return a; } template <class T> MArray<T>& operator -= (MArray<T>& a, const MArray<T>& b) { if (a.is_shared ()) a = a - b; else do_mm_inplace_op<MArray<T>, MArray<T> > (a, b, mx_inline_sub2, "-="); return a; } template <class T> MArray<T>& product_eq (MArray<T>& a, const MArray<T>& b) { if (a.is_shared ()) return a = product (a, b); else do_mm_inplace_op<MArray<T>, MArray<T> > (a, b, mx_inline_mul2, ".*="); return a; } template <class T> MArray<T>& quotient_eq (MArray<T>& a, const MArray<T>& b) { if (a.is_shared ()) return a = quotient (a, b); else do_mm_inplace_op<MArray<T>, MArray<T> > (a, b, mx_inline_div2, "./="); return a; } // Element by element MArray by scalar ops. #define MARRAY_AS_OP(OP, FN) \ template <class T> \ MArray<T> \ operator OP (const MArray<T>& a, const T& s) \ { \ return do_ms_binary_op<MArray<T>, MArray<T>, T> (a, s, FN); \ } MARRAY_AS_OP (+, mx_inline_add) MARRAY_AS_OP (-, mx_inline_sub) MARRAY_AS_OP (*, mx_inline_mul) MARRAY_AS_OP (/, mx_inline_div) // Element by element scalar by MArray ops. #define MARRAY_SA_OP(OP, FN) \ template <class T> \ MArray<T> \ operator OP (const T& s, const MArray<T>& a) \ { \ return do_sm_binary_op<MArray<T>, T, MArray<T> > (s, a, FN); \ } MARRAY_SA_OP(+, mx_inline_add) MARRAY_SA_OP(-, mx_inline_sub) MARRAY_SA_OP(*, mx_inline_mul) MARRAY_SA_OP(/, mx_inline_div) // Element by element MArray by MArray ops. #define MARRAY_AA_OP(FCN, OP, FN) \ template <class T> \ MArray<T> \ FCN (const MArray<T>& a, const MArray<T>& b) \ { \ return do_mm_binary_op<MArray<T>, MArray<T>, MArray<T> > (a, b, FN, #FCN); \ } MARRAY_AA_OP (operator +, +, mx_inline_add) MARRAY_AA_OP (operator -, -, mx_inline_sub) MARRAY_AA_OP (product, *, mx_inline_mul) MARRAY_AA_OP (quotient, /, mx_inline_div) // Unary MArray ops. template <class T> MArray<T> operator + (const MArray<T>& a) { return a; } template <class T> MArray<T> operator - (const MArray<T>& a) { return do_mx_unary_op<MArray<T>, MArray<T> > (a, mx_inline_uminus); } /* ;;; Local Variables: *** ;;; mode: C++ *** ;;; End: *** */