# HG changeset patch # User jwe # Date 1076908043 0 # Node ID bec345670e563b7f1c950d66752b3ce28eee7ebf # Parent c62b067609f8d7a61507c5a91ebce77966a96a71 [project @ 2004-02-16 05:07:23 by jwe] diff -r c62b067609f8 -r bec345670e56 liboctave/Array-C.cc --- a/liboctave/Array-C.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/Array-C.cc Mon Feb 16 05:07:23 2004 +0000 @@ -33,6 +33,8 @@ INSTANTIATE_ARRAY_AND_ASSIGN (Complex); +INSTANTIATE_CAT (Complex); + INSTANTIATE_ARRAY_ASSIGN (Complex, double); INSTANTIATE_ARRAY_ASSIGN (Complex, int); INSTANTIATE_ARRAY_ASSIGN (Complex, short); diff -r c62b067609f8 -r bec345670e56 liboctave/Array-ch.cc --- a/liboctave/Array-ch.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/Array-ch.cc Mon Feb 16 05:07:23 2004 +0000 @@ -31,6 +31,8 @@ INSTANTIATE_ARRAY_AND_ASSIGN (char); +INSTANTIATE_CAT (char); + #include "Array2.h" template class Array2; diff -r c62b067609f8 -r bec345670e56 liboctave/Array-d.cc --- a/liboctave/Array-d.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/Array-d.cc Mon Feb 16 05:07:23 2004 +0000 @@ -31,6 +31,8 @@ INSTANTIATE_ARRAY_AND_ASSIGN (double); +INSTANTIATE_CAT (double); + INSTANTIATE_ARRAY_ASSIGN (double, int); INSTANTIATE_ARRAY_ASSIGN (double, short); INSTANTIATE_ARRAY_ASSIGN (double, char); diff -r c62b067609f8 -r bec345670e56 liboctave/Array.cc --- a/liboctave/Array.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/Array.cc Mon Feb 16 05:07:23 2004 +0000 @@ -2999,6 +2999,38 @@ } template +bool +cat_ra (Array& ra_cat, const Array& ra_arg, int dim, int add_dim) +{ + bool retval = false; + + dim_vector dv = ra_arg.dims (); + + Array ra_idx (dv.length (), 0); + + for (int i = 0; i < ra_arg.length (); i++) + { + if (i != 0) + increment_index (ra_idx, dv); + + Array ra_idx2 = ra_idx; + + if (dim >= ra_idx2.length ()) + { + ra_idx2.resize_and_fill (dim + 1, 0); + + retval = true; + } + + ra_idx2(dim) = ra_idx2(dim) + add_dim; + + ra_cat(ra_idx2) = ra_arg(ra_idx); + } + + return retval; +} + +template void Array::print_info (std::ostream& os, const std::string& prefix) const { diff -r c62b067609f8 -r bec345670e56 liboctave/Array.h --- a/liboctave/Array.h Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/Array.h Mon Feb 16 05:07:23 2004 +0000 @@ -523,6 +523,10 @@ // Array::dimensions should be protected, not public, but we can't // do that because of bugs in gcc prior to 3.3. +template +bool +cat_ra (Array& ra_cat, const Array& ra_arg, int dim, int add_dim); + template /* friend */ int assign (Array& lhs, const Array& rhs, const LT& rfv); @@ -553,9 +557,14 @@ template int assignN (Array&, const Array&, const LT&); \ template int assign (Array&, const Array&) + #define INSTANTIATE_ARRAY(T) \ template class Array; \ - template T resize_fill_value (const T&) + template T resize_fill_value (const T&); \ + +#define INSTANTIATE_CAT(T) \ + template bool cat_ra (Array& ra_cat, const Array& ra_arg, \ + int dim, int add_dim) #define INSTANTIATE_ARRAY_AND_ASSIGN(T) \ INSTANTIATE_ARRAY (T); \ diff -r c62b067609f8 -r bec345670e56 liboctave/CNDArray.cc --- a/liboctave/CNDArray.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/CNDArray.cc Mon Feb 16 05:07:23 2004 +0000 @@ -232,7 +232,7 @@ } bool -ComplexNDArray::cat (ComplexNDArray& cat_arr, int dim, int add_dim) const +ComplexNDArray::cat (const ComplexNDArray& ra_arg, int dim, int add_dim) { MX_ND_CAT; } diff -r c62b067609f8 -r bec345670e56 liboctave/CNDArray.h --- a/liboctave/CNDArray.h Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/CNDArray.h Mon Feb 16 05:07:23 2004 +0000 @@ -87,7 +87,7 @@ ComplexNDArray prod (int dim = -1) const; ComplexNDArray sum (int dim = -1) const; ComplexNDArray sumsq (int dim = -1) const; - bool cat (ComplexNDArray& cat_array, int dim, int add_dim) const; + bool cat (const ComplexNDArray& ra_arg, int dim, int add_dim); NDArray abs (void) const; diff -r c62b067609f8 -r bec345670e56 liboctave/chNDArray.cc --- a/liboctave/chNDArray.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/chNDArray.cc Mon Feb 16 05:07:23 2004 +0000 @@ -49,7 +49,7 @@ } bool -charNDArray::cat (charNDArray& cat_arr, int dim, int add_dim) const +charNDArray::cat (const charNDArray& ra_arg, int dim, int add_dim) { MX_ND_CAT; } diff -r c62b067609f8 -r bec345670e56 liboctave/chNDArray.h --- a/liboctave/chNDArray.h Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/chNDArray.h Mon Feb 16 05:07:23 2004 +0000 @@ -71,7 +71,7 @@ boolNDArray all (int dim = -1) const; boolNDArray any (int dim = -1) const; - bool cat (charNDArray& cat_array, int dim, int add_dim) const; + bool cat (const charNDArray& ra_arg, int dim, int add_dim); charMatrix matrix_value (void) const; diff -r c62b067609f8 -r bec345670e56 liboctave/dNDArray.cc --- a/liboctave/dNDArray.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/dNDArray.cc Mon Feb 16 05:07:23 2004 +0000 @@ -213,9 +213,10 @@ } bool -NDArray::cat (NDArray& cat_arr, int dim, int add_dim) const +NDArray::cat (const NDArray& ra_arg, int dim, int add_dim) { - MX_ND_CAT; + // MX_ND_CAT; + return ::cat_ra (*this, ra_arg, dim, add_dim); } NDArray diff -r c62b067609f8 -r bec345670e56 liboctave/dNDArray.h --- a/liboctave/dNDArray.h Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/dNDArray.h Mon Feb 16 05:07:23 2004 +0000 @@ -86,7 +86,7 @@ NDArray prod (int dim = -1) const; NDArray sum (int dim = -1) const; NDArray sumsq (int dim = -1) const; - bool cat (NDArray& cat_array, int dim, int add_dim) const; + bool cat (const NDArray& ra_arg, int dim, int add_dim); NDArray abs (void) const; diff -r c62b067609f8 -r bec345670e56 liboctave/mx-inlines.cc --- a/liboctave/mx-inlines.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/liboctave/mx-inlines.cc Mon Feb 16 05:07:23 2004 +0000 @@ -610,11 +610,11 @@ #define MX_ND_CAT \ bool retval = false;\ \ - dim_vector dv = dims (); \ + dim_vector dv = ra_arg.dims (); \ \ Array ra_idx (dv.length (), 0); \ \ - for (int i = 0; i < length (); i++) \ + for (int i = 0; i < ra_arg.length (); i++) \ { \ if (i != 0) \ increment_index (ra_idx, dv, 0); \ @@ -630,7 +630,7 @@ \ ra_idx2.elem (dim) = ra_idx2.elem (dim) + add_dim; \ \ - cat_arr.elem (ra_idx2) = elem (ra_idx); \ + elem (ra_idx2) = ra_arg.elem (ra_idx); \ } \ \ return retval diff -r c62b067609f8 -r bec345670e56 src/ChangeLog --- a/src/ChangeLog Sun Feb 15 06:06:24 2004 +0000 +++ b/src/ChangeLog Mon Feb 16 05:07:23 2004 +0000 @@ -1,3 +1,7 @@ +2004-02-15 Petter Risholm + + * ov-cell.cc (Fstruct2cell): New function. + 2004-02-14 John W. Eaton * Makefile.in (OCTINTERP_LINK_DEPS, OCT_LINK_DEPS): Always define. diff -r c62b067609f8 -r bec345670e56 src/data.cc --- a/src/data.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/src/data.cc Mon Feb 16 05:07:23 2004 +0000 @@ -808,7 +808,7 @@ cat_cx = ComplexNDArray (cat_re); extended_dims = - tmp.complex_array_value ().cat (cat_cx, dim, curr_add_dims); + cat_cx.cat (tmp.complex_array_value (), dim, curr_add_dims); t = COMPLEX; } @@ -819,18 +819,18 @@ cat_ch = charNDArray (octave_value (cat_re).char_array_value ()); extended_dims = - tmp.char_array_value ().cat (cat_ch, dim, curr_add_dims); + cat_ch.cat (tmp.char_array_value (), dim, curr_add_dims); t = CHAR; } else extended_dims = - tmp.array_value().cat (cat_re, dim, curr_add_dims); + cat_re.cat (tmp.array_value(), dim, curr_add_dims); } else if (t == COMPLEX) { extended_dims = - tmp.complex_array_value ().cat (cat_cx, dim, curr_add_dims); + cat_cx.cat (tmp.complex_array_value (), dim, curr_add_dims); } else if (t == CHAR) { @@ -841,7 +841,7 @@ } else extended_dims = - tmp.char_array_value ().cat (cat_ch, dim, curr_add_dims); + cat_ch.cat (tmp.char_array_value (), dim, curr_add_dims); } if (error_state) return retval; // Wrong conversion in the last if statement diff -r c62b067609f8 -r bec345670e56 src/ov-cell.cc --- a/src/ov-cell.cc Sun Feb 15 06:06:24 2004 +0000 +++ b/src/ov-cell.cc Mon Feb 16 05:07:23 2004 +0000 @@ -44,6 +44,7 @@ #include "ov-base-mat.cc" #include "ov-re-mat.h" #include "ov-scalar.h" +#include "Array-util.h" #include "byte-swap.h" #include "ls-oct-ascii.h" @@ -1010,6 +1011,86 @@ return retval; } +DEFUN (struct2cell, args, , + "-*- texinfo -*-\n\ +@deftypefn {Built-in Function} {} struct2cell (@var{S})\n\ +Create a new cell array from the objects stored in the struct object.\n\ +If F is the number of fields in the structure, the resulting cell array will\n\ +have a dimension vector corresponding to [F size(S)].\n\ +\n\ +@end deftypefn\n\ +@seealso{cell2struct, fieldnames}") +{ + octave_value retval; + + int nargin = args.length (); + + if (nargin == 1) + { + Octave_map m = args(0).map_value(); + + if (! error_state) + { + dim_vector m_dv = m.dims (); + + string_vector keys = m.keys (); + + int fields_numel = keys.length (); + + // The resulting dim_vector should have dimensions: + // [numel(fields) size(struct)] + dim_vector result_dv; + result_dv.resize (m_dv.length () + 1); //Add 1 for the fields + + result_dv(0) = fields_numel; + + for (int i = 1; i < result_dv.length (); i++) + result_dv(i) = m_dv(i-1); + + // Squeeze to be sure that a (3,1) vector doesn't + // get turned into a (3,3,1) vector. + result_dv = result_dv.squeeze (); + + Cell c (result_dv); + + // Use ra_idx both for counting and for assignments, + // so ra_idx(0) will both contain fields_numel for + // each call to increment_index and j for each assignment. + Array ra_idx (result_dv.length (), 0); + ra_idx(0) = fields_numel; + + for (int i = 0; i < m_dv.numel (); i++) + { + for (int j = 0; j < fields_numel; j++) + { + ra_idx(0) = j; + + Cell c_tmp = m.contents (keys(j)); + + if (c_tmp.length () > 1) // Is a cell + c(ra_idx) = c_tmp; + else if (c_tmp.length () == 1) // Get octave_value + c(ra_idx) = c_tmp(0); + else // c.tmp.length () == 0, Create empty Cell + c(ra_idx) = Cell(); + + ra_idx(0) = fields_numel; + } + + increment_index(ra_idx, result_dv); + } + + retval = c; + } + else + error ("struct2cell: expecting argument to be a cell array"); + } + else + print_usage ("struct2cell"); + + return retval; +} + /* ;;; Local Variables: *** ;;; mode: C++ ***