# HG changeset patch # User Colin Macdonald # Date 1469866440 25200 # Node ID 3f74eeb0a5dac120dfca0a224cc56289959591f6 # Parent 510ed59a61d3564353fc8b91b610ce166b39eb02 pyobject: add method for converting pyobject to cell array * @pyobject/cell.m: New method. diff -r 510ed59a61d3 -r 3f74eeb0a5da @pyobject/cell.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/@pyobject/cell.m Sat Jul 30 01:14:00 2016 -0700 @@ -0,0 +1,86 @@ +## 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 . + +## -*- 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})