diff scripts/general/structfun.m @ 6863:3c64128e621c

[project @ 2007-09-05 07:52:48 by dbateman]
author dbateman
date Wed, 05 Sep 2007 07:53:45 +0000
parents
children 8b0cfeb06365
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/general/structfun.m	Wed Sep 05 07:53:45 2007 +0000
@@ -0,0 +1,87 @@
+## Copyright (C) 2007  David Bateman
+##
+## This file is part of Octave.
+##
+## Octave 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 2, or (at your option)
+## any later version.
+##
+## Octave 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 Octave; see the file COPYING.  If not, write to the Free
+## Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} structfun (@var{func}, @var{s})
+## @deftypefnx {Function File} {[@var{a}, @var{b}] =} structfun (@dots{})
+## @deftypefnx {Function File} {} structfun (@dots{}, 'ErrorHandler', @var{errfunc})
+## @deftypefnx {Function File} {} structfun (@dots{}, 'UniformOutput', @var{val})
+## 
+## Evaluate the function named @var{name} on the fields of the structure
+## @var{s}. The fields of @var{s} are passed the the function @var{func}
+## individually.
+##
+## @code{structfun} accepts an arbitrary function @var{func} in the form of 
+## an inline function, function handle, or the name of a function (in a 
+## character string). In the case of a character string argument, the 
+## function must accept a single argument named @var{x}, and it must return 
+## a string value. If the function returns more than one argument, they are
+## returned as separate output variables.
+##
+## If the param 'UniformOutput' is set to true (the default), then the function
+## must return either a single element which will be concatenated into the
+## return value. If 'UniformOutput is false, the outputs placed in a structure
+## with the same fieldnames as the input structure.
+## 
+## @example
+## @group
+## s.name1 = "John Smith"; 
+## s.name2 = "Jill Jones"; 
+## structfun (@{x@} regexp (x, '(\w+)$', 'matches')@{1@}, s, 
+##            'UniformOutput', false)
+## @end group
+## @end example
+## 
+## Given the parameter 'ErrorHandler', then @var{errfunc} defines a function to
+## call in case @var{func} generates an error. The form of the function is
+## 
+## @example
+## function [@dots{}] = errfunc (@var{se}, @dots{})
+## @end example
+## 
+## where there is an additional input argument to @var{errfunc} relative to
+## @var{func}, given by @var{se}. This is a structure with the elements
+## 'identifier', 'message' and 'index', giving respectively the error
+## identifier, the error message, and the index into the input arguments
+## of the element that caused the error.
+## @seealso{cellfun, arrayfun}
+## @end deftypefn
+
+function varargout = structfun (fun, s, varargin);
+  if (nargin < 2)
+    print_usage ();
+  endif
+
+  varargout = cell (max ([nargout, 1]), 1);
+  [varargout{:}] = cellfun (fun, struct2cell (s), varargin {:});
+
+  if (iscell (varargout{1}))
+    [varargout{:}] = cell2struct (varargout{1}, fieldnames(s), 1);
+  endif
+endfunction
+
+
+%!test
+%! s.name1 = "John Smith"; 
+%! s.name2 = "Jill Jones"; 
+%! l.name1 = "Smith";
+%! l.name2 = "Jones";
+%! o = structfun (@(x) regexp (x, '(\w+)$', 'matches'){1}, s, 
+%!		  'UniformOutput', false);
+%! assert (o, l);