annotate scripts/legacy/vectorize.m @ 33619:4818ea4e33d9 default tip @

maint: Merge stable to default.
author Markus Mützel <markus.muetzel@gmx.de>
date Thu, 23 May 2024 16:56:15 +0200
parents 2e484f9f1f18
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
1 ########################################################################
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
2 ##
32632
2e484f9f1f18 maint: update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
3 ## Copyright (C) 2020-2024 The Octave Project Developers
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
4 ##
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
5 ## See the file COPYRIGHT.md in the top-level directory of this
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
6 ## distribution or <https://octave.org/copyright/>.
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
7 ##
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
8 ## This file is part of Octave.
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
9 ##
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
10 ## Octave is free software: you can redistribute it and/or modify it
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
11 ## under the terms of the GNU General Public License as published by
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
12 ## the Free Software Foundation, either version 3 of the License, or
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
13 ## (at your option) any later version.
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
14 ##
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
15 ## Octave is distributed in the hope that it will be useful, but
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
18 ## GNU General Public License for more details.
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
19 ##
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
20 ## You should have received a copy of the GNU General Public License
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
21 ## along with Octave; see the file COPYING. If not, see
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
22 ## <https://www.gnu.org/licenses/>.
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
23 ##
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
24 ########################################################################
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
26 ## -*- texinfo -*-
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
27 ## @deftypefn {} {@var{vfcn} =} vectorize (@var{fcn})
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
28 ## Create a vectorized version of the anonymous function or expression
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
29 ## @var{fcn} by replacing all occurrences of @code{*}, @code{/}, etc.,
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
30 ## with @code{.*}, @code{./}, etc.
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
31 ##
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
32 ## Note that the transformation is extremely simplistic. Use of this
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
33 ## function is strongly discouraged. It may be removed from a future
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
34 ## version of Octave.
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
35 ## @end deftypefn
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
36
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
37 function vfcn = vectorize (fcn)
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
38
28458
ef8cf8dda0ba warn if legacy inline, genvarname or vectorize functions are used
John W. Eaton <jwe@octave.org>
parents: 28456
diff changeset
39 persistent warned = false;
ef8cf8dda0ba warn if legacy inline, genvarname or vectorize functions are used
John W. Eaton <jwe@octave.org>
parents: 28456
diff changeset
40 if (! warned)
ef8cf8dda0ba warn if legacy inline, genvarname or vectorize functions are used
John W. Eaton <jwe@octave.org>
parents: 28456
diff changeset
41 warned = true;
ef8cf8dda0ba warn if legacy inline, genvarname or vectorize functions are used
John W. Eaton <jwe@octave.org>
parents: 28456
diff changeset
42 warning ("Octave:legacy-function",
ef8cf8dda0ba warn if legacy inline, genvarname or vectorize functions are used
John W. Eaton <jwe@octave.org>
parents: 28456
diff changeset
43 "vectorize is unreliable; its use is strongly discouraged\n");
ef8cf8dda0ba warn if legacy inline, genvarname or vectorize functions are used
John W. Eaton <jwe@octave.org>
parents: 28456
diff changeset
44 endif
ef8cf8dda0ba warn if legacy inline, genvarname or vectorize functions are used
John W. Eaton <jwe@octave.org>
parents: 28456
diff changeset
45
28891
de5f2f9a64ff maint: Use same coding style when checking for a minimum of 1 input.
Rik <rik@octave.org>
parents: 28886
diff changeset
46 if (nargin < 1)
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
47 print_usage ();
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
48 endif
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
49
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 30911
diff changeset
50 if (is_function_handle (fcn))
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
51 finfo = functions (fcn);
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
52 if (! strcmp (finfo.type, "anonymous"))
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
53 error ("vectorize: FCN must be a string or anonymous function handle");
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
54 endif
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
55 expr = finfo.function;
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
56 idx = index (expr, ")");
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
57 args = expr(1:idx);
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
58 expr = expr(idx+1:end);
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
59 new_expr = __vectorize__ (expr);
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
60 vfcn = str2func ([args, new_expr]);
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
61 elseif (ischar (fcn))
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
62 vfcn = __vectorize__ (fcn);
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
63 else
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
64 error ("vectorize: FCN must be a string or anonymous function handle");
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
65 endif
28945
6e460773bdda maint: Use newlines after "function" and before "endfunction" for clarity.
Rik <rik@octave.org>
parents: 28931
diff changeset
66
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
67 endfunction
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
68
28931
c5b1bbb95a66 maint: start %!demo or %!test blocks 2 newlines after endfunction.
Rik <rik@octave.org>
parents: 28891
diff changeset
69
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
70 %!assert (vectorize ("x.^2 + 1"), "x.^2 + 1")
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
71 %!test
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
72 %! fh = @(x) x.^2 + 1;
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
73 %! finfo = functions (vectorize (fh));
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
74 %! assert (finfo.function, "@(x) x .^ 2 + 1");
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
75
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
76 %!assert (vectorize ("1e-3*y + 2e4*z"), "1e-3.*y + 2e4.*z")
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
77 %!test
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
78 %! fh = @(x, y, z) 1e-3*y + 2e4*z;
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
79 %! finfo = functions (vectorize (fh));
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
80 %! assert (finfo.function, "@(x, y, z) 1e-3 .* y + 2e4 .* z");
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
81
30031
cf60f8f636f6 Start deprecation of Fortran exponentiation operator.
Rik <rik@octave.org>
parents: 29359
diff changeset
82 %!assert (vectorize ("2^x^5"), "2.^x.^5")
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
83 %!test
30031
cf60f8f636f6 Start deprecation of Fortran exponentiation operator.
Rik <rik@octave.org>
parents: 29359
diff changeset
84 %! fh = @(x) 2^x^5;
28456
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
85 %! finfo = functions (vectorize (fh));
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
86 %! assert (finfo.function, "@(x) 2 .^ x .^ 5");
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
87
53d8e7ca99c5 revive legacy vectorize function for strings and function handles
John W. Eaton <jwe@octave.org>
parents:
diff changeset
88 ## Test input validation
28886
d8318c12d903 test: remove unnecessary BIST tests in m-files checking for excessive number of inputs.
Rik <rik@octave.org>
parents: 28458
diff changeset
89 %!error <Invalid call> vectorize ()
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30875
diff changeset
90 %!error <FCN must be a string or anonymous function handle> vectorize (1)