Mercurial > octave
diff libinterp/corefcn/dot.cc @ 20918:6f0bd96f93c0
maint: Use new C++ archetype in more files.
Place input validation first in files.
Move declaration of retval down in function to be closer to point of usage.
Eliminate else clause after if () error.
Use "return ovl()" where it makes sense.
* __dispatch__.cc, __dsearchn__.cc, __ichol__.cc, __lin_interpn__.cc,
balance.cc, betainc.cc, bitfcns.cc, bsxfun.cc, cellfun.cc, colloc.cc, conv2.cc,
daspk.cc, dasrt.cc, dassl.cc, data.cc, debug.cc, dirfns.cc, dlmread.cc, dot.cc,
eig.cc, error.cc, fft.cc, fft2.cc, fftn.cc, file-io.cc, ov-type-conv.h:
Use new C++ archetype in more files.
author | Rik <rik@octave.org> |
---|---|
date | Wed, 16 Dec 2015 15:00:31 -0800 |
parents | 1142cf6abc0d |
children | fcac5dbbf9ed |
line wrap: on
line diff
--- a/libinterp/corefcn/dot.cc Wed Dec 16 17:09:44 2015 -0500 +++ b/libinterp/corefcn/dot.cc Wed Dec 16 15:00:31 2015 -0800 @@ -122,116 +122,108 @@ @seealso{cross, divergence}\n\ @end deftypefn") { - octave_value retval; int nargin = args.length (); if (nargin < 2 || nargin > 3) print_usage (); + octave_value retval; octave_value argx = args(0); octave_value argy = args(1); - if (argx.is_numeric_type () && argy.is_numeric_type ()) - { - dim_vector dimx = argx.dims (); - dim_vector dimy = argy.dims (); - bool match = dimx == dimy; - if (! match && nargin == 2 - && dimx.is_vector () && dimy.is_vector ()) - { - // Change to column vectors. - dimx = dimx.redim (1); - argx = argx.reshape (dimx); - dimy = dimy.redim (1); - argy = argy.reshape (dimy); - match = dimx == dimy; - } + if (! argx.is_numeric_type () || ! argy.is_numeric_type ()) + error ("dot: X and Y must be numeric"); - if (match) - { - int dim; - if (nargin == 2) - dim = dimx.first_non_singleton (); - else - dim = args(2).int_value (true) - 1; + dim_vector dimx = argx.dims (); + dim_vector dimy = argy.dims (); + bool match = dimx == dimy; + if (! match && nargin == 2 && dimx.is_vector () && dimy.is_vector ()) + { + // Change to column vectors. + dimx = dimx.redim (1); + argx = argx.reshape (dimx); + dimy = dimy.redim (1); + argy = argy.reshape (dimy); + match = dimx == dimy; + } - if (dim < 0) - error ("dot: DIM must be a valid dimension"); - else - { - octave_idx_type m, n, k; - dim_vector dimz; - if (argx.is_complex_type () || argy.is_complex_type ()) - { - if (argx.is_single_type () || argy.is_single_type ()) - { - FloatComplexNDArray x = argx.float_complex_array_value (); - FloatComplexNDArray y = argy.float_complex_array_value (); - get_red_dims (dimx, dimy, dim, dimz, m, n, k); - FloatComplexNDArray z (dimz); + if (! match) + error ("dot: sizes of X and Y must match"); - F77_XFCN (cdotc3, CDOTC3, (m, n, k, - x.data (), y.data (), - z.fortran_vec ())); - retval = z; - } - else - { - ComplexNDArray x = argx.complex_array_value (); - ComplexNDArray y = argy.complex_array_value (); - get_red_dims (dimx, dimy, dim, dimz, m, n, k); - ComplexNDArray z (dimz); + int dim; + if (nargin == 2) + dim = dimx.first_non_singleton (); + else + dim = args(2).int_value (true) - 1; - F77_XFCN (zdotc3, ZDOTC3, (m, n, k, - x.data (), y.data (), - z.fortran_vec ())); - retval = z; - } - } - else if (argx.is_float_type () && argy.is_float_type ()) - { - if (argx.is_single_type () || argy.is_single_type ()) - { - FloatNDArray x = argx.float_array_value (); - FloatNDArray y = argy.float_array_value (); - get_red_dims (dimx, dimy, dim, dimz, m, n, k); - FloatNDArray z (dimz); + if (dim < 0) + error ("dot: DIM must be a valid dimension"); - F77_XFCN (sdot3, SDOT3, (m, n, k, x.data (), y.data (), - z.fortran_vec ())); - retval = z; - } - else - { - NDArray x = argx.array_value (); - NDArray y = argy.array_value (); - get_red_dims (dimx, dimy, dim, dimz, m, n, k); - NDArray z (dimz); + octave_idx_type m, n, k; + dim_vector dimz; + if (argx.is_complex_type () || argy.is_complex_type ()) + { + if (argx.is_single_type () || argy.is_single_type ()) + { + FloatComplexNDArray x = argx.float_complex_array_value (); + FloatComplexNDArray y = argy.float_complex_array_value (); + get_red_dims (dimx, dimy, dim, dimz, m, n, k); + FloatComplexNDArray z (dimz); - F77_XFCN (ddot3, DDOT3, (m, n, k, x.data (), y.data (), - z.fortran_vec ())); - retval = z; - } - } - else - { - // Non-optimized evaluation. - octave_value_list tmp; - tmp(1) = dim + 1; - tmp(0) = do_binary_op (octave_value::op_el_mul, argx, argy); - - tmp = feval ("sum", tmp, 1); - if (! tmp.empty ()) - retval = tmp(0); - } - } + F77_XFCN (cdotc3, CDOTC3, (m, n, k, + x.data (), y.data (), + z.fortran_vec ())); + retval = z; } else - error ("dot: sizes of X and Y must match"); + { + ComplexNDArray x = argx.complex_array_value (); + ComplexNDArray y = argy.complex_array_value (); + get_red_dims (dimx, dimy, dim, dimz, m, n, k); + ComplexNDArray z (dimz); + F77_XFCN (zdotc3, ZDOTC3, (m, n, k, + x.data (), y.data (), + z.fortran_vec ())); + retval = z; + } + } + else if (argx.is_float_type () && argy.is_float_type ()) + { + if (argx.is_single_type () || argy.is_single_type ()) + { + FloatNDArray x = argx.float_array_value (); + FloatNDArray y = argy.float_array_value (); + get_red_dims (dimx, dimy, dim, dimz, m, n, k); + FloatNDArray z (dimz); + + F77_XFCN (sdot3, SDOT3, (m, n, k, x.data (), y.data (), + z.fortran_vec ())); + retval = z; + } + else + { + NDArray x = argx.array_value (); + NDArray y = argy.array_value (); + get_red_dims (dimx, dimy, dim, dimz, m, n, k); + NDArray z (dimz); + + F77_XFCN (ddot3, DDOT3, (m, n, k, x.data (), y.data (), + z.fortran_vec ())); + retval = z; + } } else - error ("dot: X and Y must be numeric"); + { + // Non-optimized evaluation. + octave_value_list tmp; + tmp(1) = dim + 1; + tmp(0) = do_binary_op (octave_value::op_el_mul, argx, argy); + + tmp = feval ("sum", tmp, 1); + if (! tmp.empty ()) + retval = tmp(0); + } return retval; } @@ -293,94 +285,89 @@ @end example\n\ @end deftypefn") { - octave_value retval; - if (args.length () != 2) print_usage (); + octave_value retval; + octave_value argx = args(0); octave_value argy = args(1); - if (argx.is_numeric_type () && argy.is_numeric_type ()) - { - const dim_vector dimx = argx.dims (); - const dim_vector dimy = argy.dims (); - int nd = dimx.length (); - octave_idx_type m = dimx(0); - octave_idx_type k = dimx(1); - octave_idx_type n = dimy(1); - octave_idx_type np = 1; - bool match = dimy(0) == k && nd == dimy.length (); - dim_vector dimz = dim_vector::alloc (nd); - dimz(0) = m; - dimz(1) = n; - for (int i = 2; match && i < nd; i++) - { - match = match && dimx(i) == dimy(i); - dimz(i) = dimx(i); - np *= dimz(i); - } - - if (match) - { - if (argx.is_complex_type () || argy.is_complex_type ()) - { - if (argx.is_single_type () || argy.is_single_type ()) - { - FloatComplexNDArray x = argx.float_complex_array_value (); - FloatComplexNDArray y = argy.float_complex_array_value (); - FloatComplexNDArray z (dimz); + if (! argx.is_numeric_type () || ! argy.is_numeric_type ()) + error ("blkmm: A and B must be numeric"); - F77_XFCN (cmatm3, CMATM3, (m, n, k, np, - x.data (), y.data (), - z.fortran_vec ())); - retval = z; - } - else - { - ComplexNDArray x = argx.complex_array_value (); - ComplexNDArray y = argy.complex_array_value (); - ComplexNDArray z (dimz); + const dim_vector dimx = argx.dims (); + const dim_vector dimy = argy.dims (); + int nd = dimx.length (); + octave_idx_type m = dimx(0); + octave_idx_type k = dimx(1); + octave_idx_type n = dimy(1); + octave_idx_type np = 1; + bool match = dimy(0) == k && nd == dimy.length (); + dim_vector dimz = dim_vector::alloc (nd); + dimz(0) = m; + dimz(1) = n; + for (int i = 2; match && i < nd; i++) + { + match = match && dimx(i) == dimy(i); + dimz(i) = dimx(i); + np *= dimz(i); + } - F77_XFCN (zmatm3, ZMATM3, (m, n, k, np, - x.data (), y.data (), - z.fortran_vec ())); - retval = z; - } - } - else - { - if (argx.is_single_type () || argy.is_single_type ()) - { - FloatNDArray x = argx.float_array_value (); - FloatNDArray y = argy.float_array_value (); - FloatNDArray z (dimz); + if (! match) + error ("blkmm: A and B dimensions don't match: (%s) and (%s)", + dimx.str ().c_str (), dimy.str ().c_str ()); - F77_XFCN (smatm3, SMATM3, (m, n, k, np, - x.data (), y.data (), - z.fortran_vec ())); - retval = z; - } - else - { - NDArray x = argx.array_value (); - NDArray y = argy.array_value (); - NDArray z (dimz); + if (argx.is_complex_type () || argy.is_complex_type ()) + { + if (argx.is_single_type () || argy.is_single_type ()) + { + FloatComplexNDArray x = argx.float_complex_array_value (); + FloatComplexNDArray y = argy.float_complex_array_value (); + FloatComplexNDArray z (dimz); - F77_XFCN (dmatm3, DMATM3, (m, n, k, np, - x.data (), y.data (), - z.fortran_vec ())); - retval = z; - } - } + F77_XFCN (cmatm3, CMATM3, (m, n, k, np, + x.data (), y.data (), + z.fortran_vec ())); + retval = z; } else - error ("blkmm: A and B dimensions don't match: (%s) and (%s)", - dimx.str ().c_str (), dimy.str ().c_str ()); + { + ComplexNDArray x = argx.complex_array_value (); + ComplexNDArray y = argy.complex_array_value (); + ComplexNDArray z (dimz); + F77_XFCN (zmatm3, ZMATM3, (m, n, k, np, + x.data (), y.data (), + z.fortran_vec ())); + retval = z; + } } else - error ("blkmm: A and B must be numeric"); + { + if (argx.is_single_type () || argy.is_single_type ()) + { + FloatNDArray x = argx.float_array_value (); + FloatNDArray y = argy.float_array_value (); + FloatNDArray z (dimz); + + F77_XFCN (smatm3, SMATM3, (m, n, k, np, + x.data (), y.data (), + z.fortran_vec ())); + retval = z; + } + else + { + NDArray x = argx.array_value (); + NDArray y = argy.array_value (); + NDArray z (dimz); + + F77_XFCN (dmatm3, DMATM3, (m, n, k, np, + x.data (), y.data (), + z.fortran_vec ())); + retval = z; + } + } return retval; }