Mercurial > hg > octave-lyh
annotate scripts/general/structfun.m @ 10132:aa0f575cf39b
improve structfun's Matlab compatibility
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 19 Jan 2010 10:06:42 +0100 |
parents | 9d1a14e12431 |
children | be13fa20656a |
rev | line source |
---|---|
8920 | 1 ## Copyright (C) 2007, 2008, 2009 David Bateman |
10132
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
2 ## Copyright (C) 2010 VZLU Prague |
6863 | 3 ## |
4 ## This file is part of Octave. | |
5 ## | |
6 ## Octave is free software; you can redistribute it and/or modify it | |
7 ## under the terms of the GNU General Public License as published by | |
7016 | 8 ## the Free Software Foundation; either version 3 of the License, or (at |
9 ## your option) any later version. | |
6863 | 10 ## |
11 ## Octave is distributed in the hope that it will be useful, but | |
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 ## General Public License for more details. | |
15 ## | |
16 ## You should have received a copy of the GNU General Public License | |
7016 | 17 ## along with Octave; see the file COPYING. If not, see |
18 ## <http://www.gnu.org/licenses/>. | |
6863 | 19 |
20 ## -*- texinfo -*- | |
21 ## @deftypefn {Function File} {} structfun (@var{func}, @var{s}) | |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
22 ## @deftypefnx {Function File} {[@var{a}, @dots{}] =} structfun (@dots{}) |
8507 | 23 ## @deftypefnx {Function File} {} structfun (@dots{}, "ErrorHandler", @var{errfunc}) |
24 ## @deftypefnx {Function File} {} structfun (@dots{}, "UniformOutput", @var{val}) | |
6863 | 25 ## |
26 ## Evaluate the function named @var{name} on the fields of the structure | |
9036
58604c45ca74
Cleanup of data types related documentation
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
27 ## @var{s}. The fields of @var{s} are passed to the function @var{func} |
6863 | 28 ## individually. |
29 ## | |
30 ## @code{structfun} accepts an arbitrary function @var{func} in the form of | |
31 ## an inline function, function handle, or the name of a function (in a | |
9036
58604c45ca74
Cleanup of data types related documentation
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
32 ## character string). In the case of a character string argument, the |
6863 | 33 ## function must accept a single argument named @var{x}, and it must return |
9036
58604c45ca74
Cleanup of data types related documentation
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
34 ## a string value. If the function returns more than one argument, they are |
6863 | 35 ## returned as separate output variables. |
36 ## | |
8828 | 37 ## If the parameter "UniformOutput" is set to true (the default), then the function |
8347
fa78cb8d8a5c
corrections for typos
Brian Gough<bjg@network-theory.co.uk>
parents:
7208
diff
changeset
|
38 ## must return a single element which will be concatenated into the |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
39 ## return value. If "UniformOutput" is false, the outputs are placed into a structure |
6863 | 40 ## with the same fieldnames as the input structure. |
41 ## | |
42 ## @example | |
43 ## @group | |
44 ## s.name1 = "John Smith"; | |
45 ## s.name2 = "Jill Jones"; | |
8507 | 46 ## structfun (@@(x) regexp (x, '(\w+)$', "matches")@{1@}, s, |
47 ## "UniformOutput", false) | |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
48 ## @result{} |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
49 ## @{ |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
50 ## name1 = Smith |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
51 ## name2 = Jones |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
52 ## @} |
6863 | 53 ## @end group |
54 ## @end example | |
55 ## | |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
56 ## Given the parameter "ErrorHandler", @var{errfunc} defines a function to |
9036
58604c45ca74
Cleanup of data types related documentation
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
57 ## call in case @var{func} generates an error. The form of the function is |
6863 | 58 ## |
59 ## @example | |
60 ## function [@dots{}] = errfunc (@var{se}, @dots{}) | |
61 ## @end example | |
62 ## | |
63 ## where there is an additional input argument to @var{errfunc} relative to | |
9036
58604c45ca74
Cleanup of data types related documentation
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
64 ## @var{func}, given by @var{se}. This is a structure with the elements |
8507 | 65 ## "identifier", "message" and "index", giving respectively the error |
6863 | 66 ## identifier, the error message, and the index into the input arguments |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
67 ## of the element that caused the error. For an example on how to use |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
68 ## an error handler, @pxref{doc-cellfun, @code{cellfun}}. |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9036
diff
changeset
|
69 ## |
6863 | 70 ## @seealso{cellfun, arrayfun} |
71 ## @end deftypefn | |
72 | |
73 function varargout = structfun (fun, s, varargin); | |
74 if (nargin < 2) | |
75 print_usage (); | |
76 endif | |
77 | |
10132
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
78 uniform_output = true; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
79 uo_str = "uniformoutput"; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
80 |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
81 nargs = length (varargin); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
82 if (nargs >= 2 && strcmpi (varargin{1}, uo_str)) |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
83 uniform_output =varargin{2}; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
84 elseif (nargs >= 4 && strcmpi (varargin{3}, uo_str)) |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
85 uniform_output =varargin{4}; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
86 endif |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
87 |
6863 | 88 varargout = cell (max ([nargout, 1]), 1); |
7208 | 89 [varargout{:}] = cellfun (fun, struct2cell (s), varargin{:}); |
6863 | 90 |
10132
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
91 if (! uniform_output) |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
92 varargout = cellfun (@cell2struct, varargout, {fieldnames(s)}, {1}, uo_str, false); |
6863 | 93 endif |
94 endfunction | |
95 | |
96 | |
97 %!test | |
98 %! s.name1 = "John Smith"; | |
99 %! s.name2 = "Jill Jones"; | |
100 %! l.name1 = "Smith"; | |
101 %! l.name2 = "Jones"; | |
8507 | 102 %! o = structfun (@(x) regexp (x, '(\w+)$', "matches"){1}, s, |
103 %! "UniformOutput", false); | |
6863 | 104 %! assert (o, l); |
10132
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
105 |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
106 %!function [a, b] = twoouts (x) |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
107 %! a = x + x; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
108 %! b = x * x; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
109 |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
110 %!test |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
111 %! s = struct ("a", {1, 2, 3}, "b", {4, 5, 6}); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
112 %! c(1:2, 1, 1) = [2; 8]; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
113 %! c(1:2, 1, 2) = [4; 10]; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
114 %! c(1:2, 1, 3) = [6; 12]; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
115 %! d(1:2, 1, 1) = [1; 16]; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
116 %! d(1:2, 1, 2) = [4; 25]; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
117 %! d(1:2, 1, 3) = [9; 36]; |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
118 %! [aa, bb] = structfun(@twoouts, s); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
119 %! assert(aa, c); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
120 %! assert(bb, d); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
121 |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
122 %!test |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
123 %! s = struct ("a", {1, 2, 3}, "b", {4, 5, 6}); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
124 %! c = struct ("a", {2, 4, 6}, "b", {8, 10, 12}); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
125 %! d = struct ("a", {1, 4, 9}, "b", {16, 25, 36}); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
126 %! [aa, bb] = structfun(@twoouts, s, "uniformoutput", false); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
127 %! assert(aa, c); |
aa0f575cf39b
improve structfun's Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
10122
diff
changeset
|
128 %! assert(bb, d); |