Mercurial > hg > octave-nkf
diff liboctave/intNDArray.cc @ 7189:e8d953d03f6a
[project @ 2007-11-26 20:42:09 by dbateman]
author | dbateman |
---|---|
date | Mon, 26 Nov 2007 20:42:11 +0000 |
parents | a018c140f8aa |
children | aab45fbcd71f a255ceb8e416 |
line wrap: on
line diff
--- a/liboctave/intNDArray.cc +++ b/liboctave/intNDArray.cc @@ -229,6 +229,140 @@ MX_ND_REDUCTION (retval(result_idx) += intNDArray<T>::elem (iter_idx), 0, intNDArray<T>); } +template <class T> +intNDArray<T> +intNDArray<T>::max (int dim) const +{ + ArrayN<octave_idx_type> dummy_idx; + return max (dummy_idx, dim); +} + +template <class T> +intNDArray<T> +intNDArray<T>::max (ArrayN<octave_idx_type>& idx_arg, int dim) const +{ + dim_vector dv = this->dims (); + dim_vector dr = this->dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return intNDArray<T> (); + + dr(dim) = 1; + + intNDArray<T> result (dr); + idx_arg.resize (dr); + + octave_idx_type x_stride = 1; + octave_idx_type x_len = dv(dim); + for (int i = 0; i < dim; i++) + x_stride *= dv(i); + + for (octave_idx_type i = 0; i < dr.numel (); i++) + { + octave_idx_type x_offset; + if (x_stride == 1) + x_offset = i * x_len; + else + { + octave_idx_type x_offset2 = 0; + x_offset = i; + while (x_offset >= x_stride) + { + x_offset -= x_stride; + x_offset2++; + } + x_offset += x_offset2 * x_stride * x_len; + } + + octave_idx_type idx_j = 0; + + T tmp_max = this->elem (x_offset); + + for (octave_idx_type j = 1; j < x_len; j++) + { + T tmp = this->elem (j * x_stride + x_offset); + + if (tmp > tmp_max) + { + idx_j = j; + tmp_max = tmp; + } + } + + result.elem (i) = tmp_max; + idx_arg.elem (i) = idx_j; + } + + return result; +} + +template <class T> +intNDArray<T> +intNDArray<T>::min (int dim) const +{ + ArrayN<octave_idx_type> dummy_idx; + return min (dummy_idx, dim); +} + +template <class T> +intNDArray<T> +intNDArray<T>::min (ArrayN<octave_idx_type>& idx_arg, int dim) const +{ + dim_vector dv = this->dims (); + dim_vector dr = this->dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return intNDArray<T> (); + + dr(dim) = 1; + + intNDArray<T> result (dr); + idx_arg.resize (dr); + + octave_idx_type x_stride = 1; + octave_idx_type x_len = dv(dim); + for (int i = 0; i < dim; i++) + x_stride *= dv(i); + + for (octave_idx_type i = 0; i < dr.numel (); i++) + { + octave_idx_type x_offset; + if (x_stride == 1) + x_offset = i * x_len; + else + { + octave_idx_type x_offset2 = 0; + x_offset = i; + while (x_offset >= x_stride) + { + x_offset -= x_stride; + x_offset2++; + } + x_offset += x_offset2 * x_stride * x_len; + } + + octave_idx_type idx_j = 0; + + T tmp_min = this->elem (x_offset); + + for (octave_idx_type j = 1; j < x_len; j++) + { + T tmp = this->elem (j * x_stride + x_offset); + + if (tmp < tmp_min) + { + idx_j = j; + tmp_min = tmp; + } + } + + result.elem (i) = tmp_min; + idx_arg.elem (i) = idx_j; + } + + return result; +} + /* ;;; Local Variables: *** ;;; mode: C++ ***