# HG changeset patch # User Jaroslav Hajek # Date 1255429370 -7200 # Node ID 192d94cff6c1f7ccb1436557db3c63a6a3ccc28b # Parent 2997727398d10624769c5c43c55de8240c6915cb improve sum & implement the 'extra' option, refactor some code diff --git a/liboctave/CNDArray.cc b/liboctave/CNDArray.cc --- a/liboctave/CNDArray.cc +++ b/liboctave/CNDArray.cc @@ -662,6 +662,12 @@ } ComplexNDArray +ComplexNDArray::xsum (int dim) const +{ + return do_mx_red_op (*this, dim, mx_inline_xsum); +} + +ComplexNDArray ComplexNDArray::sumsq (int dim) const { return do_mx_red_op (*this, dim, mx_inline_sumsq); diff --git a/liboctave/CNDArray.h b/liboctave/CNDArray.h --- a/liboctave/CNDArray.h +++ b/liboctave/CNDArray.h @@ -81,6 +81,7 @@ ComplexNDArray cumsum (int dim = -1) const; ComplexNDArray prod (int dim = -1) const; ComplexNDArray sum (int dim = -1) const; + ComplexNDArray xsum (int dim = -1) const; ComplexNDArray sumsq (int dim = -1) const; ComplexNDArray concat (const ComplexNDArray& rb, const Array& ra_idx); ComplexNDArray concat (const NDArray& rb, const Array& ra_idx); diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,20 @@ +2009-10-13 Jaroslav Hajek + + * lo-traits.h (equal_types, is_instance, subst_template_param): New + traits classes. + * mx-inlines.cc (op_dble_sum, twosum_accum): New helper funcs. + (mx_inline_dsum, mx_inline_xsum): New reduction loops. + * fNDArray.cc (FloatNDArray::dsum): New method. + * fNDArray.h: Declare it. + * fCNDArray.cc (FloatComplexNDArray::dsum): New method. + * fCNDArray.h: Declare it. + * dNDArray.cc (NDArray::xsum): New method. + * dNDArray.h: Declare it. + * CNDArray.cc (ComplexNDArray::xsum): New method. + * CNDArray.h: Declare it. + * intNDArray.cc (intNDArray::dsum): New method. + * intNDArray.h: Declare it. + 2009-10-12 Jaroslav Hajek * base-qr.cc (base_qr::regular): New method. diff --git a/liboctave/dNDArray.cc b/liboctave/dNDArray.cc --- a/liboctave/dNDArray.cc +++ b/liboctave/dNDArray.cc @@ -726,6 +726,12 @@ } NDArray +NDArray::xsum (int dim) const +{ + return do_mx_red_op (*this, dim, mx_inline_xsum); +} + +NDArray NDArray::sumsq (int dim) const { return do_mx_red_op (*this, dim, mx_inline_sumsq); diff --git a/liboctave/dNDArray.h b/liboctave/dNDArray.h --- a/liboctave/dNDArray.h +++ b/liboctave/dNDArray.h @@ -92,6 +92,7 @@ NDArray cumsum (int dim = -1) const; NDArray prod (int dim = -1) const; NDArray sum (int dim = -1) const; + NDArray xsum (int dim = -1) const; NDArray sumsq (int dim = -1) const; NDArray concat (const NDArray& rb, const Array& ra_idx); ComplexNDArray concat (const ComplexNDArray& rb, const Array& ra_idx); diff --git a/liboctave/fCNDArray.cc b/liboctave/fCNDArray.cc --- a/liboctave/fCNDArray.cc +++ b/liboctave/fCNDArray.cc @@ -656,6 +656,12 @@ return do_mx_red_op (*this, dim, mx_inline_sum); } +ComplexNDArray +FloatComplexNDArray::dsum (int dim) const +{ + return do_mx_red_op (*this, dim, mx_inline_dsum); +} + FloatComplexNDArray FloatComplexNDArray::sumsq (int dim) const { diff --git a/liboctave/fCNDArray.h b/liboctave/fCNDArray.h --- a/liboctave/fCNDArray.h +++ b/liboctave/fCNDArray.h @@ -81,6 +81,7 @@ FloatComplexNDArray cumsum (int dim = -1) const; FloatComplexNDArray prod (int dim = -1) const; FloatComplexNDArray sum (int dim = -1) const; + ComplexNDArray dsum (int dim = -1) const; FloatComplexNDArray sumsq (int dim = -1) const; FloatComplexNDArray concat (const FloatComplexNDArray& rb, const Array& ra_idx); FloatComplexNDArray concat (const FloatNDArray& rb, const Array& ra_idx); diff --git a/liboctave/fNDArray.cc b/liboctave/fNDArray.cc --- a/liboctave/fNDArray.cc +++ b/liboctave/fNDArray.cc @@ -683,6 +683,12 @@ return do_mx_red_op (*this, dim, mx_inline_sum); } +NDArray +FloatNDArray::dsum (int dim) const +{ + return do_mx_red_op (*this, dim, mx_inline_dsum); +} + FloatNDArray FloatNDArray::sumsq (int dim) const { diff --git a/liboctave/fNDArray.h b/liboctave/fNDArray.h --- a/liboctave/fNDArray.h +++ b/liboctave/fNDArray.h @@ -89,6 +89,7 @@ FloatNDArray cumsum (int dim = -1) const; FloatNDArray prod (int dim = -1) const; FloatNDArray sum (int dim = -1) const; + NDArray dsum (int dim = -1) const; FloatNDArray sumsq (int dim = -1) const; FloatNDArray concat (const FloatNDArray& rb, const Array& ra_idx); FloatComplexNDArray concat (const FloatComplexNDArray& rb, const Array& ra_idx); diff --git a/liboctave/intNDArray.cc b/liboctave/intNDArray.cc --- a/liboctave/intNDArray.cc +++ b/liboctave/intNDArray.cc @@ -209,6 +209,13 @@ } template +NDArray +intNDArray::dsum (int dim) const +{ + return do_mx_red_op (*this, dim, mx_inline_dsum); +} + +template intNDArray intNDArray::cumsum (int dim) const { diff --git a/liboctave/intNDArray.h b/liboctave/intNDArray.h --- a/liboctave/intNDArray.h +++ b/liboctave/intNDArray.h @@ -25,6 +25,7 @@ #include "MArrayN.h" #include "boolNDArray.h" +class NDArray; template class @@ -90,6 +91,7 @@ intNDArray cummin (ArrayN& index, int dim = 0) const; intNDArray sum (int dim) const; + NDArray dsum (int dim) const; intNDArray cumsum (int dim) const; intNDArray diff (octave_idx_type order = 1, int dim = 0) const; diff --git a/liboctave/lo-traits.h b/liboctave/lo-traits.h --- a/liboctave/lo-traits.h +++ b/liboctave/lo-traits.h @@ -48,6 +48,41 @@ typedef T2 result; }; +// Determine whether two types are equal. +template +class equal_types +{ +public: + + static const bool value = false; +}; + +template +class equal_types +{ +public: + + static const bool value = false; +}; + +// Determine whether a type is an instance of a template. + +template