# HG changeset patch # User jwe # Date 1071072714 0 # Node ID 6639c25740236f53d7ed3c3cfb30b86237b07423 # Parent 2c5adf308c84f6817ff2072b367c895dbfed876d [project @ 2003-12-10 16:11:54 by jwe] diff -r 2c5adf308c84 -r 6639c2574023 liboctave/Array-util.cc --- a/liboctave/Array-util.cc Tue Dec 09 19:43:01 2003 +0000 +++ b/liboctave/Array-util.cc Wed Dec 10 16:11:54 2003 +0000 @@ -311,15 +311,6 @@ return retval; } -dim_vector -get_zero_len_size (const dim_vector& /* frozen_lengths */, - const dim_vector& /* dimensions */) -{ - dim_vector retval; - assert (0); - return retval; -} - bool all_colon_equiv (const Array& ra_idx, const dim_vector& frozen_lengths) diff -r 2c5adf308c84 -r 6639c2574023 liboctave/Array.cc --- a/liboctave/Array.cc Tue Dec 09 19:43:01 2003 +0000 +++ b/liboctave/Array.cc Wed Dec 10 16:11:54 2003 +0000 @@ -1859,6 +1859,7 @@ else { dim_vector new_dims; + new_dims.resize (n_dims); for (int i = 0; i < n_dims; i++) @@ -1867,6 +1868,8 @@ new_dims(i) = 1; } + new_dims.chop_trailing_singletons (); + retval = Array (new_dims); } } @@ -1885,6 +1888,8 @@ new_dims(i) = 1; } + new_dims.chop_trailing_singletons (); + retval = Array (tmp, new_dims); } else @@ -1917,6 +1922,8 @@ result_dims(1) = (ntot > 0 ? 1 : 0); } + result_dims.chop_trailing_singletons (); + retval.resize (result_dims); int n = number_of_elements (result_dims); @@ -2022,14 +2029,12 @@ { if (all_ok (ra_idx)) { - if (any_orig_empty (ra_idx)) + if (any_orig_empty (ra_idx) || any_zero_len (frozen_lengths)) { + frozen_lengths.chop_trailing_singletons (); + retval.resize (frozen_lengths); } - else if (any_zero_len (frozen_lengths)) - { - retval.resize (get_zero_len_size (frozen_lengths, dimensions)); - } else if (all_colon_equiv (ra_idx, dimensions) && frozen_lengths.length () == n_dims) { @@ -2037,9 +2042,13 @@ } else { - retval.resize (frozen_lengths); - - int n = number_of_elements (frozen_lengths); + dim_vector frozen_lengths_for_resize = frozen_lengths; + + frozen_lengths_for_resize.chop_trailing_singletons (); + + retval.resize (frozen_lengths_for_resize); + + int n = retval.length (); Array result_idx (ra_idx.length (), 0); @@ -2051,17 +2060,13 @@ { elt_idx = get_elt_idx (ra_idx, result_idx); - int numelem_result = - get_scalar_idx (result_idx, frozen_lengths); - int numelem_elt = get_scalar_idx (elt_idx, this_dims); - if (numelem_result > length () || numelem_result < 0 - || numelem_elt > length () || numelem_elt < 0) + if (numelem_elt > length () || numelem_elt < 0) (*current_liboctave_error_handler) - ("attempt to grow array along ambiguous dimension"); + ("invalid N-d array index"); else - retval.checkelem (numelem_result) = checkelem (numelem_elt); + retval.elem (i) = elem (numelem_elt); increment_index (result_idx, frozen_lengths); diff -r 2c5adf308c84 -r 6639c2574023 liboctave/ChangeLog --- a/liboctave/ChangeLog Tue Dec 09 19:43:01 2003 +0000 +++ b/liboctave/ChangeLog Wed Dec 10 16:11:54 2003 +0000 @@ -1,3 +1,18 @@ +2003-12-10 John W. Eaton + + * Array-util.cc (get_zero_len_size): Delete. + * Array.cc (Array::index (Array&, int, const T&)): + Handle zero-length result dimensions the same as empty original + indices. + +2003-12-09 John W. Eaton + + * dim-vector.h (dim_vector::chop_trailing_singleton_dims, + dim_vector::dim_vector_rep::chop_trailing_singleton_dims): + New functions. + * Array.cc (ArrayN::indexN): Use it. + (ArrayN::index (Array&, int, const T&)): Likewise. + 2003-11-26 John W. Eaton * boolNDArray.cc: Define BOOL ops. Define mixed CMP ops. diff -r 2c5adf308c84 -r 6639c2574023 liboctave/dim-vector.h --- a/liboctave/dim-vector.h Tue Dec 09 19:43:01 2003 +0000 +++ b/liboctave/dim-vector.h Wed Dec 10 16:11:54 2003 +0000 @@ -111,6 +111,17 @@ return dims[i]; } + void chop_trailing_singletons (void) + { + for (int i = ndims - 1; i > 1; i--) + { + if (dims[i] == 1) + ndims--; + else + break; + } + } + private: // No assignment! @@ -200,7 +211,6 @@ } } - std::string str (char sep = 'x') const { OSSTREAM buf; @@ -287,6 +297,12 @@ return retval; } + + void chop_trailing_singletons (void) + { + make_unique (); + rep->chop_trailing_singletons (); + } }; static inline bool diff -r 2c5adf308c84 -r 6639c2574023 scripts/ChangeLog --- a/scripts/ChangeLog Tue Dec 09 19:43:01 2003 +0000 +++ b/scripts/ChangeLog Wed Dec 10 16:11:54 2003 +0000 @@ -1,3 +1,7 @@ +2003-12-10 Quentin Spencer + + * statistics/base/mean.m: Remove special case for row vectors. + 2003-11-19 Quentin Spencer * signal/freqz_plot.m: Save and restore automatic_replot too. diff -r 2c5adf308c84 -r 6639c2574023 scripts/statistics/base/mean.m --- a/scripts/statistics/base/mean.m Tue Dec 09 19:43:01 2003 +0000 +++ b/scripts/statistics/base/mean.m Wed Dec 10 16:11:54 2003 +0000 @@ -87,10 +87,6 @@ usage ("mean (x, dim, opt) or mean (x, dim, opt)"); endif - if (rows (x) == 1) - x = x.'; - endif - if (need_dim) t = find (size (x) != 1); if (isempty (t)) diff -r 2c5adf308c84 -r 6639c2574023 src/ChangeLog --- a/src/ChangeLog Tue Dec 09 19:43:01 2003 +0000 +++ b/src/ChangeLog Wed Dec 10 16:11:54 2003 +0000 @@ -1,3 +1,11 @@ +2003-12-09 John W. Eaton + + * OPERATORS/op-cell.cc: Allow transpose for cell arrays. + * OPERATORS/op-m-m.cc, OPERATORS/op-cm-cm.cc, + OPERATORS/op-bm-bm.cc, OPERATORS/op-streamoff.cc, + OPERATORS/op-str-str.cc: Improve error message for attempt to + transpose N-d object. + 2003-11-27 John W. Eaton * pt-arg-list.cc (F__end__): Handle N-d objects. diff -r 2c5adf308c84 -r 6639c2574023 src/OPERATORS/op-bm-bm.cc --- a/src/OPERATORS/op-bm-bm.cc Tue Dec 09 19:43:01 2003 +0000 +++ b/src/OPERATORS/op-bm-bm.cc Wed Dec 10 16:11:54 2003 +0000 @@ -45,7 +45,13 @@ { CAST_UNOP_ARG (const octave_bool_matrix&); - return octave_value (v.bool_matrix_value().transpose ()); + if (v.ndims () > 2) + { + error ("transpose not defined for N-d objects"); + return octave_value (); + } + else + return octave_value (v.bool_matrix_value().transpose ()); } // bool matrix by bool matrix ops. diff -r 2c5adf308c84 -r 6639c2574023 src/OPERATORS/op-cell.cc --- a/src/OPERATORS/op-cell.cc Tue Dec 09 19:43:01 2003 +0000 +++ b/src/OPERATORS/op-cell.cc Wed Dec 10 16:11:54 2003 +0000 @@ -39,11 +39,27 @@ // cell ops. +DEFUNOP (transpose, cell) +{ + CAST_UNOP_ARG (const octave_cell&); + + if (v.ndims () > 2) + { + error ("transpose not defined for N-d objects"); + return octave_value (); + } + else + return octave_value (Cell (v.cell_value().transpose ())); +} + DEFASSIGNANYOP_FN (assign, cell, assign); void install_cell_ops (void) { + INSTALL_UNOP (op_transpose, octave_cell, transpose); + INSTALL_UNOP (op_hermitian, octave_cell, transpose); + INSTALL_ASSIGNANYOP (op_asn_eq, octave_cell, assign); } diff -r 2c5adf308c84 -r 6639c2574023 src/OPERATORS/op-cm-cm.cc --- a/src/OPERATORS/op-cm-cm.cc Tue Dec 09 19:43:01 2003 +0000 +++ b/src/OPERATORS/op-cm-cm.cc Wed Dec 10 16:11:54 2003 +0000 @@ -46,14 +46,26 @@ { CAST_UNOP_ARG (const octave_complex_matrix&); - return octave_value (v.complex_matrix_value().transpose ()); + if (v.ndims () > 2) + { + error ("transpose not defined for N-d objects"); + return octave_value (); + } + else + return octave_value (v.complex_matrix_value().transpose ()); } DEFUNOP (hermitian, complex_matrix) { CAST_UNOP_ARG (const octave_complex_matrix&); - return octave_value (v.complex_matrix_value().hermitian ()); + if (v.ndims () > 2) + { + error ("complex-conjugate transpose not defined for N-d objects"); + return octave_value (); + } + else + return octave_value (v.complex_matrix_value().hermitian ()); } DEFNCUNOP_METHOD (incr, complex_matrix, increment) diff -r 2c5adf308c84 -r 6639c2574023 src/OPERATORS/op-m-m.cc --- a/src/OPERATORS/op-m-m.cc Tue Dec 09 19:43:01 2003 +0000 +++ b/src/OPERATORS/op-m-m.cc Wed Dec 10 16:11:54 2003 +0000 @@ -46,7 +46,13 @@ { CAST_UNOP_ARG (const octave_matrix&); - return octave_value (v.matrix_value().transpose ()); + if (v.ndims () > 2) + { + error ("transpose not defined for N-d objects"); + return octave_value (); + } + else + return octave_value (v.matrix_value().transpose ()); } DEFNCUNOP_METHOD (incr, matrix, increment) diff -r 2c5adf308c84 -r 6639c2574023 src/OPERATORS/op-str-str.cc --- a/src/OPERATORS/op-str-str.cc Tue Dec 09 19:43:01 2003 +0000 +++ b/src/OPERATORS/op-str-str.cc Wed Dec 10 16:11:54 2003 +0000 @@ -41,7 +41,13 @@ { CAST_UNOP_ARG (const octave_char_matrix_str&); - return octave_value (v.char_matrix_value().transpose (), true); + if (v.ndims () > 2) + { + error ("transpose not defined for N-d objects"); + return octave_value (); + } + else + return octave_value (v.char_matrix_value().transpose (), true); } // string by string ops. diff -r 2c5adf308c84 -r 6639c2574023 src/OPERATORS/op-streamoff.cc --- a/src/OPERATORS/op-streamoff.cc Tue Dec 09 19:43:01 2003 +0000 +++ b/src/OPERATORS/op-streamoff.cc Wed Dec 10 16:11:54 2003 +0000 @@ -38,7 +38,13 @@ { CAST_UNOP_ARG (const octave_streamoff&); - return octave_value (streamoff_array (v.streamoff_array_value().transpose ())); + if (v.ndims () > 2) + { + error ("transpose not defined for N-d objects"); + return octave_value (); + } + else + return octave_value (streamoff_array (v.streamoff_array_value().transpose ())); } DEFNCUNOP_METHOD (incr, streamoff, increment)