# HG changeset patch # User jwe # Date 1134075710 0 # Node ID 3074a549d64455f28783591c40c9007f42ecf8bf # Parent f7b4dfd541d13a2fc6cd8a4fafea03fb2784771a [project @ 2005-12-08 21:01:50 by jwe] diff -r f7b4dfd541d1 -r 3074a549d644 src/Cell.cc --- a/src/Cell.cc Thu Dec 08 16:57:31 2005 +0000 +++ b/src/Cell.cc Thu Dec 08 21:01:50 2005 +0000 @@ -115,6 +115,31 @@ } Cell +Cell::column (octave_idx_type i) const +{ + Cell retval; + + if (ndims () < 3) + { + if (i < 0 || i >= cols ()) + error ("invalid column selection"); + else + { + octave_idx_type nr = rows (); + + retval.resize (dim_vector (nr, 1)); + + for (octave_idx_type j = 0; j < nr; j++) + retval.xelem (j) = elem (j, i); + } + } + else + error ("Cell::column: requires 2-d cell array"); + + return retval; +} + +Cell Cell::concat (const Cell& rb, const Array& ra_idx) { return insert (rb, ra_idx); diff -r f7b4dfd541d1 -r 3074a549d644 src/Cell.h --- a/src/Cell.h Thu Dec 08 16:57:31 2005 +0000 +++ b/src/Cell.h Thu Dec 08 21:01:50 2005 +0000 @@ -90,6 +90,8 @@ Cell reshape (const dim_vector& new_dims) const { return ArrayN::reshape (new_dims); } + Cell column (octave_idx_type i) const; + // XXX FIXME XXX boolMatrix all (int /* dim */ = 0) const { return boolMatrix (); } diff -r f7b4dfd541d1 -r 3074a549d644 src/ChangeLog --- a/src/ChangeLog Thu Dec 08 16:57:31 2005 +0000 +++ b/src/ChangeLog Thu Dec 08 21:01:50 2005 +0000 @@ -1,5 +1,14 @@ +2005-12-08 John W. Eaton + + * Cell.cc (Cell::column): New function. + * pt-loop.cc (DO_ND_LOOP): Simplify. + (simple_for_loop_command::eval): Correctly handle N-d numeric and + cell arrays when only the first dimension is 0. + 2005-12-07 John W. Eaton + * lex.l (NL): Also accept '\r'. + * error.cc (Vbacktrace_on_warning, warning_options, Vlast_warning_id, Vlast_error_id): New file-scope variables. (Vwarning_frequency, Vwarning_option): Delete unused variables. diff -r f7b4dfd541d1 -r 3074a549d644 src/lex.l --- a/src/lex.l Thu Dec 08 16:57:31 2005 +0000 +++ b/src/lex.l Thu Dec 08 21:01:50 2005 +0000 @@ -275,7 +275,7 @@ D [0-9] S [ \t] -NL ((\n)|(\r\n)) +NL ((\n)|(\r)|(\r\n)) SNL ({S}|{NL}) EL (\.\.\.) BS (\\) diff -r f7b4dfd541d1 -r 3074a549d644 src/pt-loop.cc --- a/src/pt-loop.cc Thu Dec 08 16:57:31 2005 +0000 +++ b/src/pt-loop.cc Thu Dec 08 21:01:50 2005 +0000 @@ -238,20 +238,25 @@ } \ while (0) -#define DO_ND_LOOP(arg) \ +#define DO_ND_LOOP(TYPE, ARG) \ do \ { \ - int ndims = dv.length (); \ - Array idx; \ - octave_idx_type steps = dv.numel () / dv (0); \ - idx.resize (ndims, idx_vector (static_cast (1))); \ - idx (0) = idx_vector (':'); \ + octave_idx_type steps = dv(1); \ \ for (octave_idx_type i = 0; i < steps; i++) \ { \ MAYBE_DO_BREAKPOINT; \ \ - octave_value val (arg.index(idx)); \ + TYPE tmp; \ + \ + int nr = ARG.rows (); \ + \ + tmp.resize (dim_vector (nr, 1)); \ + \ + for (int j = 0; j < nr; j++) \ + tmp.xelem (j) = ARG.xelem (j, i); \ + \ + octave_value val (tmp); \ \ bool quit = false; \ \ @@ -261,14 +266,6 @@ if (quit) \ break; \ \ - for (int j = 1; j < ndims; j++) \ - { \ - idx(j) = idx_vector (idx(j)(0) + 2); \ - if (idx(j)(0) < dv(j)) \ - break; \ - else \ - idx(j) = idx_vector (static_cast (1)); \ - } \ } \ } \ while (0) @@ -382,12 +379,27 @@ if (error_state) goto cleanup; - if (dv.numel () > 0) + // XXX FIXME XXX -- maybe we need a function for this? + int ndims = dv.length (); + for (int i = 2; i < ndims; i++) + dv(1) *= dv(i); + + if (dv(1) > 0) { if (rhs.is_real_type ()) - DO_ND_LOOP(m_tmp); + { + if (ndims > 2) + m_tmp = m_tmp.reshape (dv); + + DO_ND_LOOP(NDArray, m_tmp); + } else - DO_ND_LOOP(cm_tmp); + { + if (ndims > 2) + cm_tmp = cm_tmp.reshape (dv); + + DO_ND_LOOP(ComplexNDArray, cm_tmp); + } } } else if (rhs.is_map ()) @@ -419,8 +431,18 @@ dim_vector dv = c_tmp.dims (); - if (dv.numel () > 0) - DO_ND_LOOP(c_tmp); + // XXX FIXME XXX -- maybe we need a function for this? + int ndims = dv.length (); + for (int i = 2; i < ndims; i++) + dv(1) *= dv(i); + + if (dv(1) > 0) + { + if (ndims > 2) + c_tmp = c_tmp.reshape (dv); + + DO_ND_LOOP(Cell, c_tmp); + } } else {