Mercurial > hg > octave-nkf
diff src/pt-loop.cc @ 5570:3074a549d644
[project @ 2005-12-08 21:01:50 by jwe]
author | jwe |
---|---|
date | Thu, 08 Dec 2005 21:01:50 +0000 |
parents | 4c8a2e4e0717 |
children | ace8d8d26933 |
line wrap: on
line diff
--- a/src/pt-loop.cc +++ b/src/pt-loop.cc @@ -238,20 +238,25 @@ } \ while (0) -#define DO_ND_LOOP(arg) \ +#define DO_ND_LOOP(TYPE, ARG) \ do \ { \ - int ndims = dv.length (); \ - Array<idx_vector> idx; \ - octave_idx_type steps = dv.numel () / dv (0); \ - idx.resize (ndims, idx_vector (static_cast<octave_idx_type> (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<octave_idx_type> (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 {