view @pyobject/cell.m @ 293:3f74eeb0a5da

pyobject: add method for converting pyobject to cell array * @pyobject/cell.m: New method.
author Colin Macdonald <cbm@m.fsf.org>
date Sat, 30 Jul 2016 01:14:00 -0700
parents
children df1bddece9d5
line wrap: on
line source

## Copyright (C) 2016 Colin B. Macdonald
##
## This file is part of Pytave
##
## Pytave is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; either version 3 of the License,
## or (at your option) any later version.
##
## This software is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty
## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
## the GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public
## License along with this software; see the file COPYING.
## If not, see <http://www.gnu.org/licenses/>.

## -*- texinfo -*-
## @documentencoding UTF-8
## @defmethod @@pyobject cell (@var{x})
## Convert an iterable Python object to a cell array.
##
## For example, by default Python lists are not automatically
## converted into native Octave objects:
## @example
## @group
## L = pyeval ("[10, 20, 'hello']")
##   @result{} L = [pyobject ...]
##
##       [10, 20, 'hello']
## @end group
## @end example
##
## However, we can convert the list to a cell array:
## @example
## @group
## C = cell (L)
##   @result{} C =
##     @{
##       [1,1] =  10
##       [1,2] =  20
##       [1,3] = hello
##     @}
## @end group
## @end example
##
## The conversion is not recursive, in the following sense:
## @example
## @group
## L = pyeval ("[10, 20, [33, 44], 50]");
## C = cell (L)
##   @result{} C =
##     @{
##       [1,1] =  10
##       [1,2] =  20
##        ...  = [pyobject ...]
##
##                 [33, 44]
##
##       [1,4] =  50
##     @}
## @end group
## @end example
##
## @seealso{cell2mat}
## @end defmethod


function c = cell (L)
  ## XXX: better implementation available possible in C++?

  c = {};
  #c = cell (size (L));  # scary, b/c "size" calls "cell"

  for i = 1:length (L)  # not numel
    c{i} = subsref (L, struct ("type", "{}", "subs", {{i}}));
  endfor
endfunction


%!test
%! L = pyeval ("(1, 2, 3)");
%! C = cell (L);
%! assert (iscell (C))
%! assert (C, {1, 2, 3})