annotate libinterp/corefcn/cellfun.cc @ 31842:79abf4cdcd95

mat2cell: Next attempt to avoid heap buffer overflow (bug #63682). * libinterp/corefcn/cellfun.cc (do_mat2cell_nd): Use sufficiently large size for all temporary buffers. Use correct values for 2nd dimension if split-values for it are omitted in the input.
author Markus Mützel <markus.muetzel@gmx.de>
date Sun, 19 Feb 2023 17:19:24 +0100
parents 0e046fefbffa
children 0199ff6cc997
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
31706
597f3ee61a48 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 31607
diff changeset
3 // Copyright (C) 2005-2023 The Octave Project Developers
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
25
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21660
diff changeset
26 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21200
diff changeset
27 # include "config.h"
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
28 #endif
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
29
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
30 #include <string>
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
31 #include <vector>
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
32 #include <list>
8994
a8d30dc1beec cellfun optimizations
Jaroslav Hajek <highegg@gmail.com>
parents: 8985
diff changeset
33 #include <memory>
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
34
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
35 #include "lo-mappers.h"
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents: 8373
diff changeset
36 #include "oct-locbuf.h"
22280
26109cce022e New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents: 22197
diff changeset
37 #include "oct-string.h"
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
38
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
39 #include "Cell.h"
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
40 #include "oct-map.h"
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
41 #include "defun.h"
26864
041caa61ed34 use get_function_handle instead of extract_function
John W. Eaton <jwe@octave.org>
parents: 26847
diff changeset
42 #include "interpreter-private.h"
22094
9203833cab7d move new interpreter class to separate file
John W. Eaton <jwe@octave.org>
parents: 22022
diff changeset
43 #include "interpreter.h"
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
44 #include "variables.h"
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
45 #include "unwind-prot.h"
21100
e39e05d90788 Switch gripe_XXX to either err_XXX or warn_XXX naming scheme.
Rik <rik@octave.org>
parents: 20980
diff changeset
46 #include "errwarn.h"
9728
70925b11ba46 again allow the obsolete syntax for cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9684
diff changeset
47 #include "utils.h"
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
48
20756
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
49 #include "ov-bool.h"
13329
80f7564a3849 handle class objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13234
diff changeset
50 #include "ov-class.h"
20756
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
51 #include "ov-colon.h"
10044
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
52 #include "ov-complex.h"
20756
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
53 #include "ov-float.h"
10044
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
54 #include "ov-flt-complex.h"
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
55 #include "ov-int16.h"
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
56 #include "ov-int32.h"
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
57 #include "ov-int64.h"
20756
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
58 #include "ov-int8.h"
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
59 #include "ov-scalar.h"
10044
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
60 #include "ov-uint16.h"
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
61 #include "ov-uint32.h"
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
62 #include "ov-uint64.h"
20756
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
63 #include "ov-uint8.h"
10044
2d7a8c227713 rewrite uniformoutput optimization in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 10043
diff changeset
64
12952
5a5cb2a4b71d cellfun: Fix a regression for function handles to overloaded functions
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12949
diff changeset
65 #include "ov-fcn-handle.h"
5a5cb2a4b71d cellfun: Fix a regression for function handles to overloaded functions
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12949
diff changeset
66
31605
e88a07dec498 maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents: 31105
diff changeset
67 OCTAVE_BEGIN_NAMESPACE(octave)
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
68
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
69 static octave_value_list
31729
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
70 get_output_list (interpreter& interp, octave_idx_type count,
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
71 octave_idx_type nargout, const octave_value_list& inputlist,
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
72 octave_value& fcn, octave_value& error_handler)
10181
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
73 {
16000
3f93cd251bdb fix ErrorHandler in cellfun (bug #38256)
Stefan Mahr <dac922@gmx.de>
parents: 15195
diff changeset
74 octave_value_list tmp;
20535
b70cc4bd8109 begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents: 20443
diff changeset
75
b70cc4bd8109 begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents: 20443
diff changeset
76 bool execution_error = false;
b70cc4bd8109 begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents: 20443
diff changeset
77
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
78 try
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
79 {
31730
610a85b0ff62 use interpreter::feval instead of global feval function
John W. Eaton <jwe@octave.org>
parents: 31729
diff changeset
80 tmp = interp.feval (fcn, inputlist, nargout);
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
81 }
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
82 catch (const execution_exception& ee)
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
83 {
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
84 if (error_handler.is_defined ())
20756
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
85 {
31729
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
86 error_system& es = interp.get_error_system ();
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
87
29028
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
88 es.save_exception (ee);
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
89 interp.recover_from_exception ();
20756
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
90
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
91 execution_error = true;
200ae1d650b7 propagate octave_execution_exception objects through try/catch blocks
John W. Eaton <jwe@octave.org>
parents: 20700
diff changeset
92 }
20535
b70cc4bd8109 begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents: 20443
diff changeset
93 else
29028
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
94 throw;
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
95 }
10181
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
96
20535
b70cc4bd8109 begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents: 20443
diff changeset
97 if (execution_error)
10181
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
98 {
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
99 if (error_handler.is_defined ())
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
100 {
31729
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
101 error_system& es = interp.get_error_system ();
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
102
11046
14993c9e857e amd.cc, cellfun.cc: use octave_scalar_map instead of Octave_map
John W. Eaton <jwe@octave.org>
parents: 10964
diff changeset
103 octave_scalar_map msg;
27160
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 26964
diff changeset
104 msg.assign ("identifier", es.last_error_id ());
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 26964
diff changeset
105 msg.assign ("message", es.last_error_message ());
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
106 msg.assign ("index",
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
107 static_cast<double> (count
25688
b2917b7858ba maint: Use Octave convention for spacing of C++ cast statements.
Rik <rik@octave.org>
parents: 25646
diff changeset
108 + static_cast<octave_idx_type> (1)));
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
109
10181
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
110 octave_value_list errlist = inputlist;
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
111 errlist.prepend (msg);
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
112
31730
610a85b0ff62 use interpreter::feval instead of global feval function
John W. Eaton <jwe@octave.org>
parents: 31729
diff changeset
113 tmp = interp.feval (error_handler, errlist, nargout);
10181
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
114 }
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
115 else
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
116 tmp.clear ();
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
117 }
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
118
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
119 return tmp;
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
120 }
a668fbd32e34 improve cellfun & avoid undefined values from builtins
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
121
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
122 // Templated function because the user can be stubborn enough to request
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
123 // a cell array as an output even in these cases where the output fits
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
124 // in an ordinary array
21139
538b57866b90 consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents: 21127
diff changeset
125 template <typename BNDA, typename NDA>
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
126 static octave_value_list
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
127 try_cellfun_internal_ops (const octave_value_list& args, int nargin)
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
128 {
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
129 octave_value_list retval;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
130
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
131 std::string name = args(0).string_value ();
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
132
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
133 const Cell f_args = args(1).cell_value ();
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
134
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
135 octave_idx_type k = f_args.numel ();
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
136
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
137 if (name == "isempty")
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
138 {
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
139 BNDA result (f_args.dims ());
13231
20ed9548070f maint: style fixes for cellfun
John W. Eaton <jwe@octave.org>
parents: 13230
diff changeset
140 for (octave_idx_type count = 0; count < k; count++)
23577
80c42f4cca13 maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents: 23576
diff changeset
141 result(count) = f_args.elem (count).isempty ();
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
142 retval(0) = result;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
143 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
144 else if (name == "islogical")
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
145 {
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
146 BNDA result (f_args.dims ());
21562
6c2fd62db1f7 maint: Eliminate accidental double spaces in code.
Rik <rik@octave.org>
parents: 21547
diff changeset
147 for (octave_idx_type count= 0; count < k; count++)
23579
c20a0fa91c0c maint: Deprecate is_bool_type and replace with islogical.
Rik <rik@octave.org>
parents: 23577
diff changeset
148 result(count) = f_args.elem (count).islogical ();
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
149 retval(0) = result;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
150 }
17002
dd783018709b Add special case function "isnumeric" to cellfun.cc (bug #39387).
Olaf Till <i7tiol@t-online.de>
parents: 16047
diff changeset
151 else if (name == "isnumeric")
dd783018709b Add special case function "isnumeric" to cellfun.cc (bug #39387).
Olaf Till <i7tiol@t-online.de>
parents: 16047
diff changeset
152 {
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
153 BNDA result (f_args.dims ());
21562
6c2fd62db1f7 maint: Eliminate accidental double spaces in code.
Rik <rik@octave.org>
parents: 21547
diff changeset
154 for (octave_idx_type count= 0; count < k; count++)
23586
f6c5db0a02e7 maint: Deprecate is_numeric_type and replace with isnumeric.
Rik <rik@octave.org>
parents: 23584
diff changeset
155 result(count) = f_args.elem (count).isnumeric ();
17002
dd783018709b Add special case function "isnumeric" to cellfun.cc (bug #39387).
Olaf Till <i7tiol@t-online.de>
parents: 16047
diff changeset
156 retval(0) = result;
dd783018709b Add special case function "isnumeric" to cellfun.cc (bug #39387).
Olaf Till <i7tiol@t-online.de>
parents: 16047
diff changeset
157 }
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
158 else if (name == "isreal")
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
159 {
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
160 BNDA result (f_args.dims ());
21562
6c2fd62db1f7 maint: Eliminate accidental double spaces in code.
Rik <rik@octave.org>
parents: 21547
diff changeset
161 for (octave_idx_type count= 0; count < k; count++)
23582
0cc2011d800e maint: Deprecate is_real_type and replace with isreal.
Rik <rik@octave.org>
parents: 23581
diff changeset
162 result(count) = f_args.elem (count).isreal ();
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
163 retval(0) = result;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
164 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
165 else if (name == "length")
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
166 {
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
167 NDA result (f_args.dims ());
21562
6c2fd62db1f7 maint: Eliminate accidental double spaces in code.
Rik <rik@octave.org>
parents: 21547
diff changeset
168 for (octave_idx_type count= 0; count < k; count++)
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
169 result(count) = static_cast<double> (f_args.elem (count).length ());
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
170 retval(0) = result;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
171 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
172 else if (name == "ndims")
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
173 {
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
174 NDA result (f_args.dims ());
13231
20ed9548070f maint: style fixes for cellfun
John W. Eaton <jwe@octave.org>
parents: 13230
diff changeset
175 for (octave_idx_type count = 0; count < k; count++)
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
176 result(count) = static_cast<double> (f_args.elem (count).ndims ());
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
177 retval(0) = result;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
178 }
17004
19b7c7412a63 cell2mat.m: Re-vamp input validation for 30% speedup
Rik <rik@octave.org>
parents: 17002
diff changeset
179 else if (name == "numel" || name == "prodofsize")
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
180 {
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
181 NDA result (f_args.dims ());
13231
20ed9548070f maint: style fixes for cellfun
John W. Eaton <jwe@octave.org>
parents: 13230
diff changeset
182 for (octave_idx_type count = 0; count < k; count++)
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
183 result(count) = static_cast<double> (f_args.elem (count).numel ());
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
184 retval(0) = result;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
185 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
186 else if (name == "size")
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
187 {
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
188 if (nargin != 3)
23803
90689bdbe048 Use C++11 raw string literals to avoid escaping double quotes.
Rik <rik@octave.org>
parents: 23693
diff changeset
189 error (R"(cellfun: not enough arguments for "size")");
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
190
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
191 int d = args(2).nint_value () - 1;
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
192
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
193 if (d < 0)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
194 error ("cellfun: K must be a positive integer");
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
195
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
196 NDA result (f_args.dims ());
20560
56fee8f84fe7 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20535
diff changeset
197
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
198 for (octave_idx_type count = 0; count < k; count++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
199 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
200 dim_vector dv = f_args.elem (count).dims ();
21660
53728df3e4c9 maint: for clarity, call ndims() rather than length() on dimension vectors.
Rik <rik@octave.org>
parents: 21581
diff changeset
201 if (d < dv.ndims ())
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
202 result(count) = static_cast<double> (dv(d));
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
203 else
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
204 result(count) = 1.0;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
205 }
20560
56fee8f84fe7 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20535
diff changeset
206
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
207 retval(0) = result;
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
208 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
209 else if (name == "isclass")
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
210 {
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
211 if (nargin != 3)
23803
90689bdbe048 Use C++11 raw string literals to avoid escaping double quotes.
Rik <rik@octave.org>
parents: 23693
diff changeset
212 error (R"(cellfun: not enough arguments for "isclass")");
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
213
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
214 std::string class_name = args(2).string_value ();
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
215 BNDA result (f_args.dims ());
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
216 for (octave_idx_type count = 0; count < k; count++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
217 result(count) = (f_args.elem (count).class_name () == class_name);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
218
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
219 retval(0) = result;
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
220 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
221
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
222 return retval;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
223 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
224
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
225 static void
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
226 get_mapper_fun_options (symbol_table& symtab,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
227 const octave_value_list& args,
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
228 int& nargin, bool& uniform_output,
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
229 octave_value& error_handler)
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
230 {
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
231 while (nargin > 3 && args(nargin-2).is_string ())
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
232 {
22280
26109cce022e New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents: 22197
diff changeset
233 std::string arg = args(nargin-2).string_value ();
14076
9aff66860e03 accept abbreviated cellfun option names
John W. Eaton <jwe@octave.org>
parents: 13960
diff changeset
234
29654
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
235 std::size_t compare_len
d13d090cb03a use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
236 = std::max (arg.length (), static_cast<std::size_t> (2));
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
237
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
238 if (string::strncmpi (arg, "uniformoutput", compare_len))
14846
460a3c6d8bf1 maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents: 14501
diff changeset
239 uniform_output = args(nargin-1).bool_value ();
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
240 else if (string::strncmpi (arg, "errorhandler", compare_len))
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
241 {
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
242 if (args(nargin-1).is_function_handle ()
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
243 || args(nargin-1).is_inline_function ())
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
244 {
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
245 error_handler = args(nargin-1);
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
246 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
247 else if (args(nargin-1).is_string ())
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
248 {
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
249 std::string err_name = args(nargin-1).string_value ();
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
250
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
251 error_handler = symtab.find_function (err_name);
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
252
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
253 if (error_handler.is_undefined ())
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
254 error ("cellfun: invalid function NAME: %s",
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
255 err_name.c_str ());
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
256 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
257 else
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
258 error ("cellfun: invalid value for 'ErrorHandler' function");
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
259 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
260 else
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
261 error ("cellfun: unrecognized parameter %s", arg.c_str ());
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
262
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
263 nargin -= 2;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
264 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
265
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
266 nargin -= 1;
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
267 }
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
268
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
269 DEFMETHOD (cellfun, interp, args, nargout,
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
270 doc: /* -*- texinfo -*-
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
271 @deftypefn {} {@var{A} =} cellfun ("@var{fcn}", @var{C})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
272 @deftypefnx {} {@var{A} =} cellfun ("size", @var{C}, @var{k})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
273 @deftypefnx {} {@var{A} =} cellfun ("isclass", @var{C}, @var{class})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
274 @deftypefnx {} {@var{A} =} cellfun (@@@var{fcn}, @var{C})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
275 @deftypefnx {} {@var{A} =} cellfun (@var{fcn}, @var{C})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
276 @deftypefnx {} {@var{A} =} cellfun (@var{fcn}, @var{C1}, @var{C2}, @dots{})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
277 @deftypefnx {} {[@var{A1}, @var{A2}, @dots{}] =} cellfun (@dots{})
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
278 @deftypefnx {} {@var{A} =} cellfun (@dots{}, "ErrorHandler", @var{errfcn})
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
279 @deftypefnx {} {@var{A} =} cellfun (@dots{}, "UniformOutput", @var{val})
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
280
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
281 Evaluate the function named "@var{fcn}" on the elements of the cell array
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
282 @var{C}.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
283
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
284 Elements in @var{C} are passed on to the named function individually. The
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
285 function @var{fcn} can be one of the functions
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
286
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
287 @table @code
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
288 @item isempty
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
289 Return 1 for empty elements.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
290
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
291 @item islogical
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
292 Return 1 for logical elements.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
293
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
294 @item isnumeric
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
295 Return 1 for numeric elements.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
296
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
297 @item isreal
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
298 Return 1 for real elements.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
299
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
300 @item length
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
301 Return a vector of the lengths of cell elements.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
302
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
303 @item ndims
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
304 Return the number of dimensions of each element.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
305
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
306 @item numel
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
307 @itemx prodofsize
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
308 Return the number of elements contained within each cell element. The
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
309 number is the product of the dimensions of the object at each cell element.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
310
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
311 @item size
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
312 Return the size along the @var{k}-th dimension.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
313
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
314 @item isclass
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
315 Return 1 for elements of @var{class}.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
316 @end table
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
317
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
318 Additionally, @code{cellfun} accepts an arbitrary function @var{fcn} in the
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
319 form of an inline function, function handle, or the name of a function (in a
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
320 character string). The function can take one or more arguments, with the
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
321 inputs arguments given by @var{C1}, @var{C2}, etc. For example:
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
322
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
323 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
324 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
325 cellfun ("atan2", @{1, 0@}, @{0, 1@})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
326 @result{} [ 1.57080 0.00000 ]
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
327 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
328 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
329
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
330 The number of output arguments of @code{cellfun} matches the number of output
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
331 arguments of the function and can be greater than one. When there are multiple
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
332 outputs of the function they will be collected into the output arguments of
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
333 @code{cellfun} like this:
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
334
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
335 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
336 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
337 function [a, b] = twoouts (x)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
338 a = x;
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
339 b = x*x;
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
340 endfunction
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
341 [aa, bb] = cellfun (@@twoouts, @{1, 2, 3@})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
342 @result{}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
343 aa =
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
344 1 2 3
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
345 bb =
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
346 1 4 9
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
347 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
348 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
349
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
350 Note that, per default, the output argument(s) are arrays of the same size as
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
351 the input arguments. Input arguments that are singleton (1x1) cells will be
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
352 automatically expanded to the size of the other arguments.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
353
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
354 If the parameter @qcode{"UniformOutput"} is set to true (the default), then the
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
355 function must return scalars which will be concatenated into the return
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
356 array(s). If @qcode{"UniformOutput"} is false, the outputs are concatenated
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
357 into a cell array (or cell arrays). For example:
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
358
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
359 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
360 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
361 cellfun ("tolower", @{"Foo", "Bar", "FooBar"@},
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
362 "UniformOutput", false)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
363 @result{} @{"foo", "bar", "foobar"@}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
364 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
365 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
366
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
367 Given the parameter @qcode{"ErrorHandler"}, then @var{errfcn} defines a
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
368 function to call in case @var{fcn} generates an error. The form of the
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
369 function is
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
370
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
371 @example
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
372 function [@dots{}] = errfcn (@var{s}, @dots{})
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
373 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
374
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
375 @noindent
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
376 where there is an additional input argument to @var{errfcn} relative to
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
377 @var{fcn}, given by @var{s}. This is a structure with the elements
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
378 @qcode{"identifier"}, @qcode{"message"}, and @qcode{"index"} giving
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
379 respectively the error identifier, the error message, and the index into the
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
380 input arguments of the element that caused the error. For example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
381
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
382 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
383 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
384 function y = foo (s, x), y = NaN; endfunction
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
385 cellfun ("factorial", @{-1,2@}, "ErrorHandler", @@foo)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
386 @result{} [NaN 2]
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
387 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
388 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
389
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
390 Use @code{cellfun} intelligently. The @code{cellfun} function is a useful tool
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
391 for avoiding loops. It is often used with anonymous function handles; however,
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
392 calling an anonymous function involves an overhead quite comparable to the
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
393 overhead of an m-file function. Passing a handle to a built-in function is
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
394 faster, because the interpreter is not involved in the internal loop. For
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
395 example:
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
396
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
397 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
398 @group
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
399 C = @{@dots{}@}
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
400 v = cellfun (@@(x) det (x), C); # compute determinants
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
401 v = cellfun (@@det, C); # 40% faster
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
402 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
403 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
404
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
405 @seealso{arrayfun, structfun, spfun}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
406 @end deftypefn */)
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
407 {
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
408 int nargin = args.length ();
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
409
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
410 if (nargin < 2)
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
411 print_usage ();
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
412
23576
00e518162fda maint: Deprecate is_cell and replace with iscell.
Rik <rik@octave.org>
parents: 23573
diff changeset
413 if (! args(1).iscell ())
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
414 error ("cellfun: C must be a cell array");
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
415
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
416 octave_value_list retval;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
417 int nargout1 = (nargout < 1 ? 1 : nargout);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
418
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
419 octave_value fcn = args(0);
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
420
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
421 symbol_table& symtab = interp.get_symbol_table ();
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
422
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
423 if (fcn.is_string ())
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
424 {
30390
a61e1a0f6024 maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents: 30323
diff changeset
425 retval = try_cellfun_internal_ops<boolNDArray, NDArray> (args, nargin);
9465
40de4692c860 auto-expanding scalar cells in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9459
diff changeset
426
20560
56fee8f84fe7 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20535
diff changeset
427 if (! retval.empty ())
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
428 return retval;
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
429
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
430 // See if we can convert the string into a function.
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
431
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
432 std::string name = args(0).string_value ();
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
433
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
434 if (! valid_identifier (name))
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
435 fcn = get_function_handle (interp, args(0), "x");
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
436 else
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
437 {
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
438 fcn = symtab.find_function (name);
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
439
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
440 if (fcn.is_undefined ())
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
441 error ("cellfun: invalid function NAME: %s", name.c_str ());
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
442 }
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
443 }
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
444
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
445 if (! fcn.is_function_handle () && ! fcn.is_inline_function ()
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
446 && ! fcn.is_function ())
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
447 error ("cellfun: argument NAME must be a string or function handle");
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
448
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
449 bool uniform_output = true;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
450 octave_value error_handler;
12952
5a5cb2a4b71d cellfun: Fix a regression for function handles to overloaded functions
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12949
diff changeset
451
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
452 get_mapper_fun_options (symtab, args, nargin, uniform_output, error_handler);
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
453
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
454 // The following is an optimization because the symbol table can give a
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
455 // more specific function class, so this can result in fewer polymorphic
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
456 // function calls as the function gets called for each value of the array.
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
457 {
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
458 if (fcn.is_function_handle () || fcn.is_inline_function ())
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
459 {
28819
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
460 // FIXME: instead of checking for overloaded functions as we did
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
461 // previously but is no longer possible, we could check whether
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
462 // the types of all the cell array elements are the same, then
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
463 // lookup the function for that type just once.
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
464
28819
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
465 goto nevermind;
13960
ef96344a6e58 cellfun: get rid of unnecessary symbol_table_lookup flag
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 13959
diff changeset
466 }
20560
56fee8f84fe7 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20535
diff changeset
467
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
468 std::string name = fcn.function_value () -> name ();
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
469 octave_value f = symtab.find_function (name);
9465
40de4692c860 auto-expanding scalar cells in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9459
diff changeset
470
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
471 if (f.is_defined ())
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
472 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
473 // Except for these two which are special cases...
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
474 if (name != "size" && name != "class")
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
475 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
476 // Try first the optimized code path for built-in functions
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
477 octave_value_list tmp_args = args;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
478 tmp_args(0) = name;
9465
40de4692c860 auto-expanding scalar cells in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9459
diff changeset
479
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
480 if (uniform_output)
27277
db687716fed6 style fixes: generally aim to break long lines before operators, not after
John W. Eaton <jwe@octave.org>
parents: 27160
diff changeset
481 retval = try_cellfun_internal_ops<boolNDArray, NDArray> (tmp_args, nargin);
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
482 else
27277
db687716fed6 style fixes: generally aim to break long lines before operators, not after
John W. Eaton <jwe@octave.org>
parents: 27160
diff changeset
483 retval = try_cellfun_internal_ops<Cell, Cell> (tmp_args, nargin);
9465
40de4692c860 auto-expanding scalar cells in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9459
diff changeset
484
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
485 if (! retval.empty ())
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
486 return retval;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
487 }
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
488
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
489 // Okay, we tried, doesn't work, let's do the best we can instead
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
490 // and avoid polymorphic calls for each element of the array.
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
491 fcn = f;
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
492 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
493 }
9465
40de4692c860 auto-expanding scalar cells in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9459
diff changeset
494
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
495 nevermind:
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
496
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
497 // Extract cell arguments.
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
498
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
499 octave_value_list inputlist (nargin, octave_value ());
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
500
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
501 OCTAVE_LOCAL_BUFFER (Cell, inputs, nargin);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
502 OCTAVE_LOCAL_BUFFER (bool, mask, nargin);
9465
40de4692c860 auto-expanding scalar cells in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9459
diff changeset
503
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
504 // This is to prevent copy-on-write.
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
505 const Cell *cinputs = inputs;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
506
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
507 octave_idx_type k = 1;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
508
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
509 dim_vector fdims (1, 1);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
510
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
511 // Collect arguments. Pre-fill scalar elements of inputlist array.
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
512
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
513 for (int j = 0; j < nargin; j++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
514 {
23576
00e518162fda maint: Deprecate is_cell and replace with iscell.
Rik <rik@octave.org>
parents: 23573
diff changeset
515 if (! args(j+1).iscell ())
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
516 error ("cellfun: arguments must be cells");
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
517
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
518 inputs[j] = args(j+1).cell_value ();
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
519 mask[j] = inputs[j].numel () != 1;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
520 if (! mask[j])
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
521 inputlist(j) = cinputs[j](0);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
522 }
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
523
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
524 for (int j = 0; j < nargin; j++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
525 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
526 if (mask[j])
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
527 {
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
528 fdims = inputs[j].dims ();
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
529 k = inputs[j].numel ();
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
530 for (int i = j+1; i < nargin; i++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
531 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
532 if (mask[i] && inputs[i].dims () != fdims)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
533 error ("cellfun: dimensions mismatch");
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
534 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
535 break;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
536 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
537 }
10670
654fbde5dceb make cellfun's fast scalar collection mechanism public
Jaroslav Hajek <highegg@gmail.com>
parents: 10521
diff changeset
538
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
539 // Apply functions.
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
540
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
541 if (uniform_output)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
542 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
543 std::list<octave_value_list> idx_list (1);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
544 idx_list.front ().resize (1);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
545 std::string idx_type = "(";
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
546
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
547 OCTAVE_LOCAL_BUFFER (octave_value, retv, nargout1);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
548
29045
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
549 int expected_nargout;
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
550 for (octave_idx_type count = 0; count < k; count++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
551 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
552 for (int j = 0; j < nargin; j++)
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
553 {
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
554 if (mask[j])
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
555 inputlist.xelem (j) = cinputs[j](count);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
556 }
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
557
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
558 const octave_value_list tmp
31729
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
559 = get_output_list (interp, count, nargout, inputlist, fcn,
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
560 error_handler);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
561
29045
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
562 int tmp_numel = tmp.length ();
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
563 if (count == 0)
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
564 expected_nargout = tmp_numel;
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
565 else if (tmp_numel != expected_nargout)
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
566 error ("cellfun: function returned unexpected number of values");
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
567
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
568 if (nargout > 0 && tmp_numel < nargout)
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
569 error ("cellfun: function returned fewer than nargout values");
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
570
22777
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
571 if (nargout > 0
29045
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
572 || (nargout == 0 && tmp_numel > 0 && tmp(0).is_defined ()))
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
573 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
574 int num_to_copy = tmp.length ();
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
575
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
576 if (num_to_copy > nargout1)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
577 num_to_copy = nargout1;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
578
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
579 if (count == 0)
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
580 {
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
581 for (int j = 0; j < num_to_copy; j++)
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
582 {
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
583 if (tmp(j).is_defined ())
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
584 {
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
585 octave_value val = tmp(j);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
586
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
587 if (val.numel () != 1)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
588 error ("cellfun: all values must be scalars when UniformOutput = true");
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
589
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
590 retv[j] = val.resize (fdims);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
591 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
592 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
593 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
594 else
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
595 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
596 for (int j = 0; j < num_to_copy; j++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
597 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
598 if (tmp(j).is_defined ())
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
599 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
600 octave_value val = tmp(j);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
601
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
602 if (! retv[j].fast_elem_insert (count, val))
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
603 {
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
604 if (val.numel () != 1)
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
605 error ("cellfun: all values must be scalars when UniformOutput = true");
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
606
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
607 idx_list.front ()(0) = count + 1.0;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
608 retv[j].assign (octave_value::op_asn_eq,
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
609 idx_type, idx_list, val);
10670
654fbde5dceb make cellfun's fast scalar collection mechanism public
Jaroslav Hajek <highegg@gmail.com>
parents: 10521
diff changeset
610 }
8994
a8d30dc1beec cellfun optimizations
Jaroslav Hajek <highegg@gmail.com>
parents: 8985
diff changeset
611 }
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
612 }
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
613 }
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
614 }
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
615 }
8994
a8d30dc1beec cellfun optimizations
Jaroslav Hajek <highegg@gmail.com>
parents: 8985
diff changeset
616
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
617 retval.resize (nargout1);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
618
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
619 for (int j = 0; j < nargout1; j++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
620 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
621 if (nargout > 0 && retv[j].is_undefined ())
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
622 retval(j) = NDArray (fdims);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
623 else
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
624 retval(j) = retv[j];
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
625 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
626 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
627 else
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
628 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
629 OCTAVE_LOCAL_BUFFER (Cell, results, nargout1);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
630
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
631 for (int j = 0; j < nargout1; j++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
632 results[j].resize (fdims, Matrix ());
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
633
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
634 bool have_some_output = false;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
635
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
636 for (octave_idx_type count = 0; count < k; count++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
637 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
638 for (int j = 0; j < nargin; j++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
639 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
640 if (mask[j])
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
641 inputlist.xelem (j) = cinputs[j](count);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
642 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
643
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
644 const octave_value_list tmp
31729
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
645 = get_output_list (interp, count, nargout, inputlist, fcn,
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
646 error_handler);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
647
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
648 if (nargout > 0 && tmp.length () < nargout)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
649 error ("cellfun: function returned fewer than nargout values");
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
650
22777
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
651 if (nargout > 0
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
652 || (nargout == 0
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
653 && tmp.length () > 0 && tmp(0).is_defined ()))
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
654 {
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
655 int num_to_copy = tmp.length ();
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
656
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
657 if (num_to_copy > nargout1)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
658 num_to_copy = nargout1;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
659
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
660 if (num_to_copy > 0)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
661 have_some_output = true;
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
662
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
663 for (int j = 0; j < num_to_copy; j++)
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
664 results[j](count) = tmp(j);
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
665 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
666 }
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
667
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
668 if (have_some_output || fdims.any_zero ())
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
669 {
9988
76cf4aec34e9 allow functions returning no value in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9740
diff changeset
670 retval.resize (nargout1);
13229
983720941822 maint: improve readability of cellfun
John W. Eaton <jwe@octave.org>
parents: 12952
diff changeset
671
9988
76cf4aec34e9 allow functions returning no value in cellfun
Jaroslav Hajek <highegg@gmail.com>
parents: 9740
diff changeset
672 for (int j = 0; j < nargout1; j++)
20980
81c2b14c209f maint: invert if/else/error instances.
John W. Eaton <jwe@octave.org>
parents: 20962
diff changeset
673 retval(j) = results[j];
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 9377
diff changeset
674 }
5205
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
675 }
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
676
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
677 return retval;
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
678 }
59592dcbb5d8 [project @ 2005-03-15 16:04:56 by jwe]
jwe
parents:
diff changeset
679
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
680 /*
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
681
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
682 %!function r = __f11 (x)
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
683 %! r = x;
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
684 %!endfunction
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
685
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
686 %!function __f01 (x)
25762
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
687 %! ## Empty function
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
688 %!endfunction
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
689
29045
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
690 %!function varargout = __f02 (out)
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
691 %! if (out)
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
692 %! varargout{1} = out;
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
693 %! endif
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
694 %!endfunction
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
695
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
696 %!test
25762
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
697 %! __cellfun_test_num_outputs__ = -1;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
698 %!
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
699 %! function r = __subf11 (x)
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
700 %! __cellfun_test_num_outputs__ = nargout;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
701 %! r = x;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
702 %! endfunction
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
703 %!
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
704 %! cellfun ("__subf11", {1});
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
705 %! assert (__cellfun_test_num_outputs__, 0);
25762
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
706 %!
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
707 %! __cellfun_test_num_outputs__ = -1;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
708 %! x = cellfun ("__subf11", {1});
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
709 %! assert (__cellfun_test_num_outputs__, 1);
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
710
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
711 %!test
25762
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
712 %! __cellfun_test_num_outputs__ = -1;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
713 %! function __subf01 (x)
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
714 %! __cellfun_test_num_outputs__ = nargout;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
715 %! endfunction
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
716 %! cellfun ("__subf01", {1});
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
717 %! assert (__cellfun_test_num_outputs__, 0);
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
718
21581
6fab85c1538f maint: Follow Octave conventions for use of semicolon in BIST tests.
Rik <rik@octave.org>
parents: 21580
diff changeset
719 %!error x = cellfun (@__f01, {1, 2})
29045
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
720 %!error x = cellfun (@__f01, {1, 2})
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
721
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
722 %!error x = cellfun (@__f02, {0, 2}, "uniformoutput", false)
4ec8a36990e8 cellfun and uniformoutput: don't fail if function returns nothing (bug #58411)
Rik <rik@octave.org>
parents: 29028
diff changeset
723 %!error x = cellfun (@__f02, {0, 2}, "uniformoutput", true)
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
724
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
725 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
726 %! assert (cellfun (@__f11, {1, 2}), [1, 2]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
727 %! assert (cellfun (@__f11, {1, 2}, 'uniformoutput', false), {1, 2});
13230
c73cc5b67feb fix nargout handling for functions called by cellfun
John W. Eaton <jwe@octave.org>
parents: 13229
diff changeset
728
11457
33f6384d2b78 cellfun compatibility fix
John W. Eaton <jwe@octave.org>
parents: 11046
diff changeset
729 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
730 %! [a,b] = cellfun (@(x) x, cell (2, 0));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
731 %! assert (a, zeros (2, 0));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
732 %! assert (b, zeros (2, 0));
11457
33f6384d2b78 cellfun compatibility fix
John W. Eaton <jwe@octave.org>
parents: 11046
diff changeset
733
33f6384d2b78 cellfun compatibility fix
John W. Eaton <jwe@octave.org>
parents: 11046
diff changeset
734 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
735 %! [a,b] = cellfun (@(x) x, cell (2, 0), "uniformoutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
736 %! assert (a, cell (2, 0));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
737 %! assert (b, cell (2, 0));
11457
33f6384d2b78 cellfun compatibility fix
John W. Eaton <jwe@octave.org>
parents: 11046
diff changeset
738
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
739 ## Test function to check the "Errorhandler" option
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
740 %!function z = __cellfunerror (S, varargin)
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
741 %! z = S;
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
742 %!endfunction
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
743
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
744 ## First input argument can be a string, an inline function,
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
745 ## a function_handle or an anonymous function
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
746 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
747 %! A = cellfun ("islogical", {true, 0.1, false, i*2});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
748 %! assert (A, [true, false, true, false]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
749 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
750 %! A = cellfun (inline ("islogical (x)", "x"), {true, 0.1, false, i*2});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
751 %! assert (A, [true, false, true, false]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
752 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
753 %! A = cellfun (@islogical, {true, 0.1, false, i*2});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
754 %! assert (A, [true, false, true, false]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
755 %!test
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
756 %! A = cellfun (@(x) islogical (x), {true, 0.1, false, i*2});
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
757 %! assert (A, [true, false, true, false]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
758
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
759 ## First input argument can be the special string "isreal",
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
760 ## "isempty", "islogical", "isnumeric", "length", "ndims" or "prodofsize"
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
761 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
762 %! A = cellfun ("isreal", {true, 0.1, {}, i*2, [], "abc"});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
763 %! assert (A, [true, true, false, false, true, true]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
764 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
765 %! A = cellfun ("isempty", {true, 0.1, false, i*2, [], "abc"});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
766 %! assert (A, [false, false, false, false, true, false]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
767 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
768 %! A = cellfun ("islogical", {true, 0.1, false, i*2, [], "abc"});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
769 %! assert (A, [true, false, true, false, false, false]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
770 %!test
17002
dd783018709b Add special case function "isnumeric" to cellfun.cc (bug #39387).
Olaf Till <i7tiol@t-online.de>
parents: 16047
diff changeset
771 %! A = cellfun ("isnumeric", {true, 0.1, false, i*2, [], "abc"});
dd783018709b Add special case function "isnumeric" to cellfun.cc (bug #39387).
Olaf Till <i7tiol@t-online.de>
parents: 16047
diff changeset
772 %! assert (A, [false, true, false, true, true, false]);
dd783018709b Add special case function "isnumeric" to cellfun.cc (bug #39387).
Olaf Till <i7tiol@t-online.de>
parents: 16047
diff changeset
773 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
774 %! A = cellfun ("length", {true, 0.1, false, i*2, [], "abc"});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
775 %! assert (A, [1, 1, 1, 1, 0, 3]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
776 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
777 %! A = cellfun ("ndims", {[1, 2; 3, 4]; (cell (1,2,3,4))});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
778 %! assert (A, [2; 4]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
779 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
780 %! A = cellfun ("prodofsize", {[1, 2; 3, 4], (cell (1,2,3,4))});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
781 %! assert (A, [4, 24]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
782
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
783 ## Number of input and output arguments may not be limited to one
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
784 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
785 %! A = cellfun (@(x,y,z) x + y + z, {1, 1, 1}, {2, 2, 2}, {3, 4, 5});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
786 %! assert (A, [6, 7, 8]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
787 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
788 %! A = cellfun (@(x,y,z) x + y + z, {1, 1, 1}, {2, 2, 2}, {3, 4, 5}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
789 %! "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
790 %! assert (A, {6, 7, 8});
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
791 %!test # Two input arguments of different types
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
792 %! A = cellfun (@(x,y) islogical (x) && ischar (y), {false, true}, {"a", 3});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
793 %! assert (A, [true, false]);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
794 %!test # Pass another variable to the anonymous function
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
795 %! y = true;
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
796 %! A = cellfun (@(x) islogical (x) && y, {false, 0.3});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
797 %! assert (A, [true, false]);
27956
2310164737b3 fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents: 26963
diff changeset
798 %!test # Three output arguments of different type
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
799 %! [A, B, C] = cellfun (@find, {10, 11; 0, 12}, "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
800 %! assert (isequal (A, {true, true; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
801 %! assert (isequal (B, {true, true; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
802 %! assert (isequal (C, {10, 11; [], 12}));
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
803
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
804 ## Input arguments can be of type cell array of logical
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
805 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
806 %! A = cellfun (@(x,y) x == y, {false, true}, {true, true});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
807 %! assert (A, [false, true]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
808 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
809 %! A = cellfun (@(x,y) x == y, {false; true}, {true; true}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
810 %! "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
811 %! assert (A, [false; true]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
812 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
813 %! A = cellfun (@(x) x, {false, true; false, true}, "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
814 %! assert (A, {false, true; false, true});
27956
2310164737b3 fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents: 26963
diff changeset
815 %!test # Three output arguments of same type
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
816 %! [A, B, C] = cellfun (@find, {true, false; false, true}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
817 %! "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
818 %! assert (isequal (A, {true, []; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
819 %! assert (isequal (B, {true, []; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
820 %! assert (isequal (C, {true, []; [], true}));
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
821 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
822 %! A = cellfun (@(x,y) cell2str (x,y), {true}, {true}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
823 %! "ErrorHandler", @__cellfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
824 %! assert (isfield (A, "identifier"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
825 %! assert (isfield (A, "message"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
826 %! assert (isfield (A, "index"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
827 %! assert (isempty (A.message), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
828 %! assert (A.index, 1);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
829 %!test # Overwriting setting of "UniformOutput" true
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
830 %! A = cellfun (@(x,y) cell2str (x,y), {true}, {true}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
831 %! "UniformOutput", true, "ErrorHandler", @__cellfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
832 %! assert (isfield (A, "identifier"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
833 %! assert (isfield (A, "message"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
834 %! assert (isfield (A, "index"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
835 %! assert (isempty (A.message), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
836 %! assert (A.index, 1);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
837
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
838 ## Input arguments can be of type cell array of numeric
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
839 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
840 %! A = cellfun (@(x,y) x>y, {1.1, 4.2}, {3.1, 2+3*i});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
841 %! assert (A, [false, true]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
842 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
843 %! A = cellfun (@(x,y) x>y, {1.1, 4.2; 2, 4}, {3.1, 2; 2, 4+2*i}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
844 %! "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
845 %! assert (A, [false, true; false, false]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
846 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
847 %! A = cellfun (@(x,y) x:y, {1.1, 4}, {3.1, 6}, "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
848 %! assert (isequal (A{1}, [1.1, 2.1, 3.1]));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
849 %! assert (isequal (A{2}, [4, 5, 6]));
27956
2310164737b3 fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents: 26963
diff changeset
850 %!test # Three output arguments of different type
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
851 %! [A, B, C] = cellfun (@find, {10, 11; 0, 12}, "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
852 %! assert (isequal (A, {true, true; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
853 %! assert (isequal (B, {true, true; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
854 %! assert (isequal (C, {10, 11; [], 12}));
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
855 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
856 %! A = cellfun (@(x,y) cell2str (x,y), {1.1, 4}, {3.1, 6}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
857 %! "ErrorHandler", @__cellfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
858 %! B = isfield (A(1), "message") && isfield (A(1), "index");
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
859 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
860 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
861 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
862 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
863 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
864 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
865 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
866 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
867 %! assert ([A(1).index, A(2).index], [1, 2]);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
868 %!test # Overwriting setting of "UniformOutput" true
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
869 %! A = cellfun (@(x,y) cell2str (x,y), {1.1, 4}, {3.1, 6}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
870 %! "UniformOutput", true, "ErrorHandler", @__cellfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
871 %! B = isfield (A(1), "message") && isfield (A(1), "index");
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
872 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
873 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
874 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
875 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
876 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
877 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
878 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
879 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
880 %! assert ([A(1).index, A(2).index], [1, 2]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
881
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
882 ## Input arguments can be of type cell arrays of character or strings
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
883 %!error # "UniformOutput" false should be used
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
884 %! A = cellfun (@(x,y) x>y, {"ad", "c", "ghi"}, {"cc", "d", "fgh"});
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
885 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
886 %! A = cellfun (@(x,y) x>y, {"a"; "f"}, {"c"; "d"}, "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
887 %! assert (A, [false; true]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
888 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
889 %! A = cellfun (@(x,y) x:y, {"a", "d"}, {"c", "f"}, "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
890 %! assert (A, {"abc", "def"});
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
891 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
892 %! A = cellfun (@(x,y) cell2str (x,y), {"a", "d"}, {"c", "f"}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
893 %! "ErrorHandler", @__cellfunerror);
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
894 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
895 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
896 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
897 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
898 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
899 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
900 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
901 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
902 %! assert ([A(1).index, A(2).index], [1, 2]);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
903 %!test # Overwriting setting of "UniformOutput" true
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
904 %! A = cellfun (@(x,y) cell2str (x,y), {"a", "d"}, {"c", "f"}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
905 %! "UniformOutput", true, "ErrorHandler", @__cellfunerror);
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
906 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
907 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
908 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
909 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
910 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
911 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
912 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
913 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
914 %! assert ([A(1).index, A(2).index], [1, 2]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
915
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
916 ## Structures cannot be handled by cellfun
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
917 %!error
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
918 %! vst1.a = 1.1; vst1.b = 4.2; vst2.a = 3.1; vst2.b = 2;
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
919 %! A = cellfun (@(x,y) (x.a < y.a) && (x.b > y.b), vst1, vst2);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
920
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
921 ## Input arguments can be of type cell array of cell arrays
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
922 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
923 %! A = cellfun (@(x,y) x{1} < y{1}, {{1.1}, {4.2}}, {{3.1}, {2}});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
924 %! assert (A, [1, 0], 1e-16);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
925 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
926 %! A = cellfun (@(x,y) x{1} < y{1}, {{1.1}; {4.2}}, {{3.1}; {2}}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
927 %! "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
928 %! assert (A, [1; 0], 1e-16);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
929 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
930 %! A = cellfun (@(x,y) x{1} < y{1}, {{1.1}, {4.2}}, {{3.1}, {2}}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
931 %! "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
932 %! assert (A, {true, false});
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
933 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
934 %! A = cellfun (@(x,y) mat2str (x,y), {{1.1}, {4.2}}, {{3.1}, {2}}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
935 %! "ErrorHandler", @__cellfunerror);
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
936 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
937 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
938 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
939 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
940 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
941 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
942 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
943 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
944 %! assert ([A(1).index, A(2).index], [1, 2]);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
945 %!test # Overwriting setting of "UniformOutput" true
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
946 %! A = cellfun (@(x,y) mat2str (x,y), {{1.1}, {4.2}}, {{3.1}, {2}}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
947 %! "UniformOutput", true, "ErrorHandler", @__cellfunerror);
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
948 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
949 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
950 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
951 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
952 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
953 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
954 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
955 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
956 %! assert ([A(1).index, A(2).index], [1, 2]);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
957
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
958 ## Input arguments can be of type cell array of structure arrays
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
959 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
960 %! a = struct ("a", 1, "b", 2); b = struct ("a", 1, "b", 3);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
961 %! A = cellfun (@(x,y) (x.a == y.a) && (x.b < y.b), {a}, {b});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
962 %! assert (A, true);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
963 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
964 %! a = struct ("a", 1, "b", 2); b = struct ("a", 1, "b", 3);
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
965 %! A = cellfun (@(x,y) (x.a == y.a) && (x.b < y.b) , {a}, {b}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
966 %! "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
967 %! assert (A, true);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
968 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
969 %! a = struct ("a", 1, "b", 2); b = struct ("a", 1, "b", 3);
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
970 %! A = cellfun (@(x,y) (x.a == y.a) && (x.b < y.b) , {a}, {b}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
971 %! "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
972 %! assert (A, {true});
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
973 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
974 %! a = struct ("a", 1, "b", 2); b = struct ("a", 1, "b", 3);
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
975 %! A = cellfun (@(x,y) cell2str (x.a, y.a), {a}, {b}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
976 %! "ErrorHandler", @__cellfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
977 %! assert (isfield (A, "identifier"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
978 %! assert (isfield (A, "message"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
979 %! assert (isfield (A, "index"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
980 %! assert (isempty (A.message), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
981 %! assert (A.index, 1);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
982 %!test # Overwriting setting of "UniformOutput" true
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
983 %! a = struct ("a", 1, "b", 2); b = struct ("a", 1, "b", 3);
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
984 %! A = cellfun (@(x,y) cell2str (x.a, y.a), {a}, {b}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
985 %! "UniformOutput", true, "ErrorHandler", @__cellfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
986 %! assert (isfield (A, "identifier"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
987 %! assert (isfield (A, "message"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
988 %! assert (isfield (A, "index"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
989 %! assert (isempty (A.message), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
990 %! assert (A.index, 1);
8373
63fe023d7898 Added more tests for cellfun.
Thomas Treichl <Thomas.Treichl@gmx.net>
parents: 8347
diff changeset
991
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
992 ## A lot of other tests
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
993 %!assert (cellfun (@sin, {0,1}), sin ([0,1]))
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
994 %!assert (cellfun (inline ("sin (x)"), {0,1}), sin ([0,1]))
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
995 %!assert (cellfun ("sin", {0,1}), sin ([0,1]))
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
996 %!assert (cellfun ("isempty", {1,[]}), [false,true])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
997 %!assert (cellfun ("islogical", {false,pi}), [true,false])
17002
dd783018709b Add special case function "isnumeric" to cellfun.cc (bug #39387).
Olaf Till <i7tiol@t-online.de>
parents: 16047
diff changeset
998 %!assert (cellfun ("isnumeric", {false,pi,struct()}), [false,true,false])
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
999 %!assert (cellfun ("isreal", {1i,1}), [false,true])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1000 %!assert (cellfun ("length", {zeros(2,2),1}), [2,1])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1001 %!assert (cellfun ("prodofsize", {zeros(2,2),1}), [4,1])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1002 %!assert (cellfun ("ndims", {zeros([2,2,2]),1}), [3,2])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1003 %!assert (cellfun ("isclass", {zeros([2,2,2]),"test"}, "double"), [true,false])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1004 %!assert (cellfun ("size", {zeros([1,2,3]),1}, 1), [1,1])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1005 %!assert (cellfun ("size", {zeros([1,2,3]),1}, 2), [2,1])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1006 %!assert (cellfun ("size", {zeros([1,2,3]),1}, 3), [3,1])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1007 %!assert (cellfun (@atan2, {1,1}, {1,2}), [atan2(1,1), atan2(1,2)])
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1008 %!assert (cellfun (@atan2, {1,1}, {1,2},"UniformOutput", false),
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1009 %! {atan2(1,1), atan2(1,2)})
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1010 %!assert (cellfun (@sin, {1,2;3,4}), sin ([1,2;3,4]))
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1011 %!assert (cellfun (@atan2, {1,1;1,1}, {1,2;1,2}), atan2 ([1,1;1,1],[1,2;1,2]))
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1012 %!error cellfun (@factorial, {-1,3})
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1013 %!assert (cellfun (@factorial,{-1,3},"ErrorHandler",@(x,y) NaN), [NaN,6])
16000
3f93cd251bdb fix ErrorHandler in cellfun (bug #38256)
Stefan Mahr <dac922@gmx.de>
parents: 15195
diff changeset
1014 %!assert (cellfun (@(x) x(2),{[1],[1,2]},"ErrorHandler",@(x,y) NaN), [NaN,2])
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
1015 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1016 %! [a,b,c] = cellfun (@fileparts, {fullfile("a","b","c.d"), fullfile("e","f","g.h")}, "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1017 %! assert (a, {fullfile("a","b"), fullfile("e","f")});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1018 %! assert (b, {"c", "g"});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1019 %! assert (c, {".d", ".h"});
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
1020
23573
1b4f4ec53b4a use new script to tag fixed bugs in tests
John W. Eaton <jwe@octave.org>
parents: 23572
diff changeset
1021 %!assert <*40467> (cellfun (@isreal, {1 inf nan []}), [true, true, true, true])
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1022 %!assert <*40467> (cellfun (@isreal, {1 inf nan []}, "UniformOutput", false),
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1023 %! {true, true, true, true})
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1024 %!assert <*40467> (cellfun (@iscomplex, {1 inf nan []}),
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1025 %! [false, false, false, false])
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1026 %!assert <*40467> (cellfun (@iscomplex, {1 inf nan []}, "UniformOutput", false),
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1027 %! {false, false, false, false})
17892
5401637c3fa7 Make cellfun obey "UniformOutput" for optimised internal functions (bug #40467)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17787
diff changeset
1028
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1029 %!error cellfun (1)
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1030 %!error cellfun ("isclass", 1)
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1031 %!error cellfun ("size", 1)
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1032 %!error cellfun (@sin, {[]}, "BadParam", false)
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1033 %!error cellfun (@sin, {[]}, "UniformOuput")
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1034 %!error cellfun (@sin, {[]}, "ErrorHandler")
29028
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1035
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1036 %!function retval = __errfcn (S, varargin)
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1037 %! global __errmsg;
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1038 %! __errmsg = S.message;
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1039 %! retval = NaN;
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1040 %!endfunction
30322
552239d43c18 update bug status
John W. Eaton <jwe@octave.org>
parents: 29654
diff changeset
1041 %!test <*58411>
29028
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1042 %! global __errmsg;
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1043 %! assert (cellfun (@factorial, {1, 2, -3}, "ErrorHandler", @__errfcn),
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1044 %! [1, 2, NaN]);
29028
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1045 %! assert (! isempty (__errmsg));
9a84aa8c4552 save last error info when cellfun error handler is defined (bug #58411)
John W. Eaton <jwe@octave.org>
parents: 28819
diff changeset
1046 %! clear -global __errmsg;
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
1047 */
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
1048
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1049 // Arrayfun was originally a .m file written by Bill Denney and Jaroslav
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1050 // Hajek. It was converted to C++ by jwe so that it could properly
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1051 // handle the nargout = 0 case.
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1052
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
1053 DEFMETHOD (arrayfun, interp, args, nargout,
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
1054 doc: /* -*- texinfo -*-
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1055 @deftypefn {} {@var{B} =} arrayfun (@var{fcn}, @var{A})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1056 @deftypefnx {} {@var{B} =} arrayfun (@var{fcn}, @var{A1}, @var{A2}, @dots{})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1057 @deftypefnx {} {[@var{B1}, @var{B2}, @dots{}] =} arrayfun (@var{fcn}, @var{A}, @dots{})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1058 @deftypefnx {} {@var{B} =} arrayfun (@dots{}, "UniformOutput", @var{val})
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1059 @deftypefnx {} {@var{B} =} arrayfun (@dots{}, "ErrorHandler", @var{errfcn})
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1060
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1061 Execute a function on each element of an array.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1062
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1063 This is useful for functions that do not accept array arguments. If the
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1064 function does accept array arguments it is @emph{better} to call the function
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1065 directly.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1066
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1067 The first input argument @var{fcn} can be a string, a function handle, an
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1068 inline function, or an anonymous function. The input argument @var{A} can be a
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1069 logical array, a numeric array, a string array, a structure array, or a cell
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1070 array. @code{arrayfun} passes all elements of @var{A} individually to the
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1071 function @var{fcn} and collects the results. The equivalent pseudo-code is
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1072
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1073 @example
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1074 @group
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1075 cls = class (@var{fcn} (@var{A}(1));
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1076 @var{B} = zeros (size (@var{A}), cls);
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1077 for i = 1:numel (@var{A})
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1078 @var{B}(i) = @var{fcn} (@var{A}(i))
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1079 endfor
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1080 @end group
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1081 @end example
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1082
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1083 The named function can also take more than two input arguments, with the input
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1084 arguments given as third input argument @var{A2}, fourth input argument
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1085 @var{A2}, @dots{} If given more than one array input argument then all input
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1086 arguments must have the same sizes. For example:
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1087
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1088 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1089 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1090 arrayfun (@@atan2, [1, 0], [0, 1])
22699
2100cd2e1be0 doc: Clarify behavior of size (bug #49478).
Rik <rik@octave.org>
parents: 22489
diff changeset
1091 @result{} [ 1.57080 0.00000 ]
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1092 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1093 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1094
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1095 If the parameter @var{val} after a further string input argument
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1096 @qcode{"UniformOutput"} is set @code{true} (the default), then the named
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1097 function @var{fcn} must return a single element which then will be concatenated
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1098 into the return value and is of type matrix. Otherwise, if that parameter is
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1099 set to @code{false}, then the outputs are concatenated in a cell array. For
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1100 example:
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1101
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1102 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1103 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1104 arrayfun (@@(x,y) x:y, "abc", "def", "UniformOutput", false)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1105 @result{}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1106 @{
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1107 [1,1] = abcd
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1108 [1,2] = bcde
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1109 [1,3] = cdef
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1110 @}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1111 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1112 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1113
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1114 If more than one output arguments are given then the named function must return
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1115 the number of return values that also are expected, for example:
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1116
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1117 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1118 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1119 [A, B, C] = arrayfun (@@find, [10; 0], "UniformOutput", false)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1120 @result{}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1121 A =
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1122 @{
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1123 [1,1] = 1
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1124 [2,1] = [](0x0)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1125 @}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1126 B =
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1127 @{
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1128 [1,1] = 1
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1129 [2,1] = [](0x0)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1130 @}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1131 C =
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1132 @{
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1133 [1,1] = 10
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1134 [2,1] = [](0x0)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1135 @}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1136 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1137 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1138
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1139 If the parameter @var{errfcn} after a further string input argument
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1140 @qcode{"ErrorHandler"} is another string, a function handle, an inline
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1141 function, or an anonymous function, then @var{errfcn} defines a function to
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1142 call in the case that @var{fcn} generates an error. The definition of the
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1143 function must be of the form
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1144
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1145 @example
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1146 function [@dots{}] = errfcn (@var{s}, @dots{})
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1147 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1148
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1149 @noindent
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1150 where there is an additional input argument to @var{errfcn} relative to
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1151 @var{fcn}, given by @var{s}. This is a structure with the elements
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1152 @qcode{"identifier"}, @qcode{"message"}, and @qcode{"index"} giving,
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1153 respectively, the error identifier, the error message, and the index of the
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1154 array elements that caused the error. The size of the output argument of
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1155 @var{errfcn} must have the same size as the output argument of @var{fcn},
30888
32d2b6604a9f doc: Ensure documentation lists output argument when it exists for functions in libinterp/
Rik <rik@octave.org>
parents: 30723
diff changeset
1156 otherwise a real error is thrown. For example:
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1157
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1158 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1159 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1160 function y = ferr (s, x), y = "MyString"; endfunction
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1161 arrayfun (@@str2num, [1234],
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1162 "UniformOutput", false, "ErrorHandler", @@ferr)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1163 @result{}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1164 @{
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1165 [1,1] = MyString
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1166 @}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1167 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1168 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1169
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1170 @seealso{spfun, cellfun, structfun}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1171 @end deftypefn */)
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1172 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1173 int nargin = args.length ();
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1174
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1175 if (nargin < 2)
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1176 print_usage ();
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1177
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1178 octave_value_list retval;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1179 int nargout1 = (nargout < 1 ? 1 : nargout);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1180 bool symbol_table_lookup = false;
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1181 octave_value fcn = args(0);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1182
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
1183 symbol_table& symtab = interp.get_symbol_table ();
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
1184
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1185 if (fcn.is_string ())
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1186 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1187 // See if we can convert the string into a function.
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1188 std::string name = args(0).string_value ();
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1189
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
1190 if (! valid_identifier (name))
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1191 fcn = get_function_handle (interp, args(0), "x");
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1192 else
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1193 {
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1194 fcn = symtab.find_function (name);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1195
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1196 if (fcn.is_undefined ())
16003
3b3321f9db9f arrayfun: adding IDs to error messages in accordance with error_ids.
Juan Pablo Carbajal <ajuanpi+dev@gmail.com>
parents: 15195
diff changeset
1197 error_with_id ("Octave:invalid-input-arg",
16010
c5d548e4101f * cellfun.cc: Style fixes.
John W. Eaton <jwe@octave.org>
parents: 16004
diff changeset
1198 "arrayfun: invalid function NAME: %s",
c5d548e4101f * cellfun.cc: Style fixes.
John W. Eaton <jwe@octave.org>
parents: 16004
diff changeset
1199 name.c_str ());
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1200
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1201 symbol_table_lookup = true;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1202 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1203 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1204
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1205 if (fcn.is_function_handle () || fcn.is_inline_function ()
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1206 || fcn.is_function ())
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1207 {
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1208 // The following is an optimization because the symbol table can give a
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1209 // more specific function class, so this can result in fewer polymorphic
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1210 // function calls as the function gets called for each value of the array.
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1211
18678
6113e0c6920b maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents: 18112
diff changeset
1212 if (! symbol_table_lookup)
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1213 {
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1214 if (fcn.is_function_handle () || fcn.class_name () == "inline")
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1215 {
28819
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
1216 // FIXME: instead of checking for overloaded functions as
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
1217 // we did previously but is no longer possible, we could
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
1218 // check whether the types of all the cell array elements
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
1219 // are the same, then lookup the function for that type
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
1220 // just once.
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1221
28819
bd71a227c562 * cellfun.cc: Update comments about overloaded function handles.
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
1222 goto nevermind;
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1223 }
26847
8bd9fd99c12a lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents: 26577
diff changeset
1224
19861
19755f4fc851 maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 19697
diff changeset
1225 octave_value f
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1226 = symtab.find_function (fcn.function_value () -> name ());
19861
19755f4fc851 maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 19697
diff changeset
1227
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1228 if (f.is_defined ())
30896
c9788d7f6e65 maint: Use "fcn" as preferred abbreviation for "function" in libinterp/.
Rik <rik@octave.org>
parents: 30888
diff changeset
1229 fcn = f;
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1230 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1231
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1232 nevermind:
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1233
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1234 bool uniform_output = true;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1235 octave_value error_handler;
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1236
23599
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
1237 get_mapper_fun_options (symtab, args, nargin, uniform_output,
5cb3a2bb5e1e don't use singleton for symbol_table
John W. Eaton <jwe@octave.org>
parents: 23592
diff changeset
1238 error_handler);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1239
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1240 octave_value_list inputlist (nargin, octave_value ());
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1241
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1242 OCTAVE_LOCAL_BUFFER (octave_value, inputs, nargin);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1243 OCTAVE_LOCAL_BUFFER (bool, mask, nargin);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1244
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1245 octave_idx_type k = 1;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1246
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1247 dim_vector fdims (1, 1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1248
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1249 // Collect arguments. Pre-fill scalar elements of inputlist array.
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1250
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1251 for (int j = 0; j < nargin; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1252 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1253 inputs[j] = args(j+1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1254 mask[j] = inputs[j].numel () != 1;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1255
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1256 if (! mask[j])
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1257 inputlist(j) = inputs[j];
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1258 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1259
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1260 for (int j = 0; j < nargin; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1261 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1262 if (mask[j])
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1263 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1264 fdims = inputs[j].dims ();
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1265 k = inputs[j].numel ();
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1266
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1267 for (int i = j+1; i < nargin; i++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1268 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1269 if (mask[i] && inputs[i].dims () != fdims)
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1270 error_with_id ("Octave:invalid-input-arg",
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1271 "arrayfun: dimensions mismatch");
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1272 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1273 break;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1274 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1275 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1276
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1277 // Apply functions.
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1278
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1279 if (uniform_output)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1280 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1281 std::list<octave_value_list> idx_list (1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1282 idx_list.front ().resize (1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1283 std::string idx_type = "(";
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1284
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1285 OCTAVE_LOCAL_BUFFER (octave_value, retv, nargout1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1286
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1287 for (octave_idx_type count = 0; count < k; count++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1288 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1289 idx_list.front ()(0) = count + 1.0;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1290
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1291 for (int j = 0; j < nargin; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1292 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1293 if (mask[j])
28631
70cdf8de553d move non-member octave_value operator functions to octave namespace
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
1294 inputlist.xelem (j) = inputs[j].index_op (idx_list);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1295 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1296
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1297 const octave_value_list tmp
31729
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
1298 = get_output_list (interp, count, nargout, inputlist, fcn,
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1299 error_handler);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1300
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1301 if (nargout > 0 && tmp.length () < nargout)
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1302 error_with_id ("Octave:invalid-fun-call",
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1303 "arrayfun: function returned fewer than nargout values");
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1304
22777
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
1305 if (nargout > 0
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
1306 || (nargout == 0
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
1307 && tmp.length () > 0 && tmp(0).is_defined ()))
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1308 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1309 int num_to_copy = tmp.length ();
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1310
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1311 if (num_to_copy > nargout1)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1312 num_to_copy = nargout1;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1313
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1314 if (count == 0)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1315 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1316 for (int j = 0; j < num_to_copy; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1317 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1318 if (tmp(j).is_defined ())
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1319 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1320 octave_value val = tmp(j);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1321
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1322 if (val.numel () == 1)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1323 retv[j] = val.resize (fdims);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1324 else
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1325 error_with_id ("Octave:invalid-fun-call",
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1326 "arrayfun: all values must be scalars when UniformOutput = true");
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1327 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1328 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1329 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1330 else
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1331 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1332 for (int j = 0; j < num_to_copy; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1333 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1334 if (tmp(j).is_defined ())
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1335 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1336 octave_value val = tmp(j);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1337
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1338 if (! retv[j].fast_elem_insert (count, val))
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1339 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1340 if (val.numel () == 1)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1341 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1342 idx_list.front ()(0) = count + 1.0;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1343 retv[j].assign (octave_value::op_asn_eq,
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1344 idx_type, idx_list, val);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1345 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1346 else
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1347 error_with_id ("Octave:invalid-fun-call",
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1348 "arrayfun: all values must be scalars when UniformOutput = true");
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1349 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1350 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1351 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1352 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1353 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1354 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1355
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1356 retval.resize (nargout1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1357
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1358 for (int j = 0; j < nargout1; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1359 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1360 if (nargout > 0 && retv[j].is_undefined ())
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1361 retval(j) = NDArray (fdims);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1362 else
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1363 retval(j) = retv[j];
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1364 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1365 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1366 else
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1367 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1368 std::list<octave_value_list> idx_list (1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1369 idx_list.front ().resize (1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1370 std::string idx_type = "(";
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1371
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1372 OCTAVE_LOCAL_BUFFER (Cell, results, nargout1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1373
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1374 for (int j = 0; j < nargout1; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1375 results[j].resize (fdims, Matrix ());
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1376
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1377 bool have_some_output = false;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1378
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1379 for (octave_idx_type count = 0; count < k; count++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1380 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1381 idx_list.front ()(0) = count + 1.0;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1382
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1383 for (int j = 0; j < nargin; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1384 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1385 if (mask[j])
28631
70cdf8de553d move non-member octave_value operator functions to octave namespace
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
1386 inputlist.xelem (j) = inputs[j].index_op (idx_list);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1387 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1388
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1389 const octave_value_list tmp
31729
c581f5ce5656 avoid an unnecessary use of __get_interpreter__
John W. Eaton <jwe@octave.org>
parents: 31706
diff changeset
1390 = get_output_list (interp, count, nargout, inputlist, fcn,
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1391 error_handler);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1392
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1393 if (nargout > 0 && tmp.length () < nargout)
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1394 error_with_id ("Octave:invalid-fun-call",
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1395 "arrayfun: function returned fewer than nargout values");
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1396
22777
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
1397 if (nargout > 0
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
1398 || (nargout == 0
4a31bd79d7e8 maint: Correct spacing around if and opening parentheses of condition.
Rik <rik@octave.org>
parents: 22755
diff changeset
1399 && tmp.length () > 0 && tmp(0).is_defined ()))
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1400 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1401 int num_to_copy = tmp.length ();
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1402
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1403 if (num_to_copy > nargout1)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1404 num_to_copy = nargout1;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1405
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1406 if (num_to_copy > 0)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1407 have_some_output = true;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1408
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1409 for (int j = 0; j < num_to_copy; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1410 results[j](count) = tmp(j);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1411 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1412 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1413
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1414 if (have_some_output || fdims.any_zero ())
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1415 {
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1416 retval.resize (nargout1);
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1417
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1418 for (int j = 0; j < nargout1; j++)
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1419 retval(j) = results[j];
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1420 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1421 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1422 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1423 else
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1424 error_with_id ("Octave:invalid-fun-call",
16010
c5d548e4101f * cellfun.cc: Style fixes.
John W. Eaton <jwe@octave.org>
parents: 16004
diff changeset
1425 "arrayfun: argument NAME must be a string or function handle");
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1426
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1427 return retval;
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1428 }
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1429
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1430 /*
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
1431 %!function r = __f11 (x)
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1432 %! r = x;
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
1433 %!endfunction
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1434
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
1435 %!function __f01 (x)
25762
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1436 %! ## Empty function
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
1437 %!endfunction
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1438
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1439 %!test
25762
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1440 %! __arrayfun_test_num_outputs__ = -1;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1441 %!
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1442 %! function r = __subf11 (x)
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1443 %! __arrayfun_test_num_outputs__ = nargout;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1444 %! r = x;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1445 %! endfunction
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1446 %!
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1447 %! arrayfun ("__subf11", {1});
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1448 %! assert (__arrayfun_test_num_outputs__, 0);
25762
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1449 %!
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1450 %! __arrayfun_test_num_outputs__ = -1;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1451 %! x = arrayfun ("__subf11", {1});
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1452 %! assert (__arrayfun_test_num_outputs__, 1);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1453
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1454 %!test
25762
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1455 %! __arrayfun_test_num_outputs__ = -1;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1456 %!
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1457 %! function __subf01 (x)
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1458 %! __arrayfun_test_num_outputs__ = nargout;
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1459 %! endfunction
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1460 %!
97ea2329d5d8 Use nested functions to prevent leaking globals in BIST tests.
Rik <rik@octave.org>
parents: 25688
diff changeset
1461 %! arrayfun ("__subf01", {1});
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1462 %! assert (__arrayfun_test_num_outputs__, 0);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1463
21581
6fab85c1538f maint: Follow Octave conventions for use of semicolon in BIST tests.
Rik <rik@octave.org>
parents: 21580
diff changeset
1464 %!error x = arrayfun (@__f01, [1, 2])
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1465
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1466 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1467 %! assert (arrayfun (@__f11, [1, 2]), [1, 2]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1468 %! assert (arrayfun (@__f11, [1, 2], "uniformoutput", false), {1, 2});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1469 %! assert (arrayfun (@__f11, {1, 2}), {1, 2});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1470 %! assert (arrayfun (@__f11, {1, 2}, "uniformoutput", false), {{1}, {2}});
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1471
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1472 %!assert (arrayfun (@ones, 1, [2,3], "uniformoutput", false), {[1,1], [1,1,1]})
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1473
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1474 ## Test function to check the "Errorhandler" option
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1475 %!function z = __arrayfunerror (S, varargin)
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1476 %! z = S;
14085
4e8f23ccadce test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents: 14076
diff changeset
1477 %!endfunction
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1478 ## First input argument can be a string, an inline function, a
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1479 ## function_handle or an anonymous function
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1480 %!test
21580
ecce63c99c3f maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents: 21562
diff changeset
1481 %! arrayfun (@isequal, [false, true], [true, true]); # No output argument
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1482 %!error
21580
ecce63c99c3f maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents: 21562
diff changeset
1483 %! arrayfun (@isequal); # One or less input arguments
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1484 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1485 %! A = arrayfun ("isequal", [false, true], [true, true]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1486 %! assert (A, [false, true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1487 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1488 %! A = arrayfun (inline ("(x == y)", "x", "y"), [false, true], [true, true]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1489 %! assert (A, [false, true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1490 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1491 %! A = arrayfun (@isequal, [false, true], [true, true]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1492 %! assert (A, [false, true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1493 %!test
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
1494 %! A = arrayfun (@(x,y) isequal (x,y), [false, true], [true, true]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1495 %! assert (A, [false, true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1496
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1497 ## Number of input and output arguments may be greater than one
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1498 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1499 %! A = arrayfun (@(x) islogical (x), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1500 %! assert (A, true);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1501 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1502 %! A = arrayfun (@(x,y,z) x + y + z, [1, 1, 1], [2, 2, 2], [3, 4, 5]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1503 %! assert (A, [6, 7, 8], 1e-16);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1504 %!test # Two input arguments of different types
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1505 %! A = arrayfun (@(x,y) islogical (x) && ischar (y), false, "a");
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1506 %! assert (A, true);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1507 %!test # Pass another variable to the anonymous function
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1508 %! y = true;
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1509 %! A = arrayfun (@(x) islogical (x && y), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1510 %! assert (A, true);
27956
2310164737b3 fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents: 26963
diff changeset
1511 %!test # Three output arguments of different type
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1512 %! [A, B, C] = arrayfun (@find, [10, 11; 0, 12], "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1513 %! assert (isequal (A, {true, true; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1514 %! assert (isequal (B, {true, true; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1515 %! assert (isequal (C, {10, 11; [], 12}));
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1516
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1517 ## Input arguments can be of type logical
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1518 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1519 %! A = arrayfun (@(x,y) x == y, [false, true], [true, true]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1520 %! assert (A, [false, true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1521 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1522 %! A = arrayfun (@(x,y) x == y, [false; true], [true; true], "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1523 %! assert (A, [false; true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1524 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1525 %! A = arrayfun (@(x) x, [false, true, false, true], "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1526 %! assert (A, {false, true, false, true});
27956
2310164737b3 fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents: 26963
diff changeset
1527 %!test # Three output arguments of same type
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1528 %! [A, B, C] = arrayfun (@find, [true, false; false, true], "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1529 %! assert (isequal (A, {true, []; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1530 %! assert (isequal (B, {true, []; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1531 %! assert (isequal (C, {true, []; [], true}));
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1532 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
1533 %! A = arrayfun (@(x,y) array2str (x,y), true, true, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1534 %! "ErrorHandler", @__arrayfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1535 %! assert (isfield (A, "identifier"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1536 %! assert (isfield (A, "message"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1537 %! assert (isfield (A, "index"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1538 %! assert (isempty (A.message), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1539 %! assert (A.index, 1);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1540 %!test # Overwriting setting of "UniformOutput" true
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
1541 %! A = arrayfun (@(x,y) array2str (x,y), true, true, "UniformOutput", true, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1542 %! "ErrorHandler", @__arrayfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1543 %! assert (isfield (A, "identifier"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1544 %! assert (isfield (A, "message"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1545 %! assert (isfield (A, "index"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1546 %! assert (isempty (A.message), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1547 %! assert (A.index, 1);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1548
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1549 ## Input arguments can be of type numeric
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1550 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1551 %! A = arrayfun (@(x,y) x>y, [1.1, 4.2], [3.1, 2+3*i]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1552 %! assert (A, [false, true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1553 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1554 %! A = arrayfun (@(x,y) x>y, [1.1, 4.2; 2, 4], [3.1, 2; 2, 4+2*i], "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1555 %! assert (A, [false, true; false, false]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1556 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1557 %! A = arrayfun (@(x,y) x:y, [1.1, 4], [3.1, 6], "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1558 %! assert (isequal (A{1}, [1.1, 2.1, 3.1]));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1559 %! assert (isequal (A{2}, [4, 5, 6]));
27956
2310164737b3 fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents: 26963
diff changeset
1560 %!test # Three output arguments of different type
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1561 %! [A, B, C] = arrayfun (@find, [10, 11; 0, 12], "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1562 %! assert (isequal (A, {true, true; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1563 %! assert (isequal (B, {true, true; [], true}));
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1564 %! assert (isequal (C, {10, 11; [], 12}));
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1565 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
1566 %! A = arrayfun (@(x,y) array2str (x,y), {1.1, 4}, {3.1, 6}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1567 %! "ErrorHandler", @__arrayfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1568 %! B = isfield (A(1), "message") && isfield (A(1), "index");
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1569 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1570 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1571 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1572 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1573 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1574 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1575 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1576 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1577 %! assert ([A(1).index, A(2).index], [1, 2]);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1578 %!test # Overwriting setting of "UniformOutput" true
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
1579 %! A = arrayfun (@(x,y) array2str (x,y), {1.1, 4}, {3.1, 6}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1580 %! "UniformOutput", true, "ErrorHandler", @__arrayfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1581 %! B = isfield (A(1), "message") && isfield (A(1), "index");
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1582 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1583 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1584 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1585 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1586 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1587 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1588 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1589 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1590 %! assert ([A(1).index, A(2).index], [1, 2]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1591
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1592 ## Input arguments can be of type character or strings
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1593 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1594 %! A = arrayfun (@(x,y) x>y, ["ad", "c", "ghi"], ["cc", "d", "fgh"]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1595 %! assert (A, [false, true, false, true, true, true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1596 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1597 %! A = arrayfun (@(x,y) x>y, ["a"; "f"], ["c"; "d"], "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1598 %! assert (A, [false; true]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1599 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1600 %! A = arrayfun (@(x,y) x:y, ["a", "d"], ["c", "f"], "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1601 %! assert (A, {"abc", "def"});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1602 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
1603 %! A = arrayfun (@(x,y) cell2str (x,y), ["a", "d"], ["c", "f"], ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1604 %! "ErrorHandler", @__arrayfunerror);
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1605 %! B = isfield (A(1), "identifier") && isfield (A(1), "message") ...
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1606 %! && isfield (A(1), "index");
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1607 %! assert (B, true);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1608
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1609 ## Input arguments can be of type structure
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1610 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1611 %! a = struct ("a", 1.1, "b", 4.2); b = struct ("a", 3.1, "b", 2);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1612 %! A = arrayfun (@(x,y) (x.a < y.a) && (x.b > y.b), a, b);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1613 %! assert (A, true);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1614 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1615 %! a = struct ("a", 1.1, "b", 4.2); b = struct ("a", 3.1, "b", 2);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1616 %! A = arrayfun (@(x,y) (x.a < y.a) && (x.b > y.b), a, b, "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1617 %! assert (A, true);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1618 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1619 %! a = struct ("a", 1.1, "b", 4.2); b = struct ("a", 3.1, "b", 2);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1620 %! A = arrayfun (@(x,y) x.a:y.a, a, b, "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1621 %! assert (isequal (A, {[1.1, 2.1, 3.1]}));
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1622 %!test
28915
c40a367a84c0 maint: Use Octave convention of space after function name in libinterp/.
Rik <rik@octave.org>
parents: 28820
diff changeset
1623 %! A = arrayfun (@(x) mat2str (x), "a", "ErrorHandler", @__arrayfunerror);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1624 %! assert (isfield (A, "identifier"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1625 %! assert (isfield (A, "message"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1626 %! assert (isfield (A, "index"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1627 %! assert (isempty (A.message), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1628 %! assert (A.index, 1);
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1629 %!test # Overwriting setting of "UniformOutput" true
28915
c40a367a84c0 maint: Use Octave convention of space after function name in libinterp/.
Rik <rik@octave.org>
parents: 28820
diff changeset
1630 %! A = arrayfun (@(x) mat2str (x), "a", "UniformOutput", true, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1631 %! "ErrorHandler", @__arrayfunerror);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1632 %! assert (isfield (A, "identifier"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1633 %! assert (isfield (A, "message"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1634 %! assert (isfield (A, "index"), true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1635 %! assert (isempty (A.message), false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1636 %! assert (A.index, 1);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1637
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22716
diff changeset
1638 ## Input arguments can be of type cell array
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1639 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1640 %! A = arrayfun (@(x,y) x{1} < y{1}, {1.1, 4.2}, {3.1, 2});
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1641 %! assert (A, [true, false]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1642 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1643 %! A = arrayfun (@(x,y) x{1} < y{1}, {1.1; 4.2}, {3.1; 2}, "UniformOutput", true);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1644 %! assert (A, [true; false]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1645 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1646 %! A = arrayfun (@(x,y) x{1} < y{1}, {1.1, 4.2}, {3.1, 2}, "UniformOutput", false);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1647 %! assert (A, {true, false});
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1648 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1649 %! A = arrayfun (@(x,y) num2str(x,y), {1.1, 4.2}, {3.1, 2}, "ErrorHandler", @__arrayfunerror);
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1650 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1651 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1652 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1653 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1654 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1655 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1656 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1657 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1658 %! assert ([A(1).index, A(2).index], [1, 2]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1659 %!test
17245
7babcdb9bc13 Use ... instead of \ for line continuation marker.
Stefan Mahr <dac922@gmx.de>
parents: 17199
diff changeset
1660 %! A = arrayfun (@(x,y) num2str (x,y), {1.1, 4.2}, {3.1, 2}, ...
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1661 %! "UniformOutput", true, "ErrorHandler", @__arrayfunerror);
30346
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1662 %! assert ([(isfield (A(1), "identifier")), (isfield (A(2), "identifier"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1663 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1664 %! assert ([(isfield (A(1), "message")), (isfield (A(2), "message"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1665 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1666 %! assert ([(isfield (A(1), "index")), (isfield (A(2), "index"))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1667 %! [true, true]);
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1668 %! assert ([(isempty (A(1).message)), (isempty (A(2).message))],
91c6288781ba maint: Shorten some long lines in libinterp to <= 80 characters (bug #57599)
Rik <rik@octave.org>
parents: 30323
diff changeset
1669 %! [false, false]);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1670 %! assert ([A(1).index, A(2).index], [1, 2]);
13234
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1671 */
e066d173aae6 improve compatibility of arrayfun for nargout = 0 case
John W. Eaton <jwe@octave.org>
parents: 13231
diff changeset
1672
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1673 static void
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1674 do_num2cell_helper (const dim_vector& dv,
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1675 const Array<int>& dimv,
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1676 dim_vector& celldv, dim_vector& arraydv,
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1677 Array<int>& perm)
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1678 {
20232
a9574e3c6e9e Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents: 20172
diff changeset
1679 int dvl = dimv.numel ();
21660
53728df3e4c9 maint: for clarity, call ndims() rather than length() on dimension vectors.
Rik <rik@octave.org>
parents: 21581
diff changeset
1680 int maxd = dv.ndims ();
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1681 celldv = dv;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1682 for (int i = 0; i < dvl; i++)
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1683 maxd = std::max (maxd, dimv(i));
21660
53728df3e4c9 maint: for clarity, call ndims() rather than length() on dimension vectors.
Rik <rik@octave.org>
parents: 21581
diff changeset
1684 if (maxd > dv.ndims ())
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1685 celldv.resize (maxd, 1);
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1686 arraydv = celldv;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1687
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1688 OCTAVE_LOCAL_BUFFER_INIT (bool, sing, maxd, false);
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1689
10350
12884915a8e4 merge MArray classes & improve Array interface
Jaroslav Hajek <highegg@gmail.com>
parents: 10291
diff changeset
1690 perm.clear (maxd, 1);
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1691 for (int i = 0; i < dvl; i++)
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1692 {
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1693 int k = dimv(i) - 1;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1694 if (k < 0)
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
1695 error ("num2cell: dimension indices must be positive");
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
1696
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
1697 if (i > 0 && k < dimv(i-1) - 1)
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
1698 error ("num2cell: dimension indices must be strictly increasing");
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1699
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1700 sing[k] = true;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1701 perm(i) = k;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1702 }
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1703
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1704 for (int k = 0, i = dvl; k < maxd; k++)
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1705 if (! sing[k])
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1706 perm(i++) = k;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1707
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1708 for (int i = 0; i < maxd; i++)
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1709 if (sing[i])
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1710 celldv(i) = 1;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1711 else
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1712 arraydv(i) = 1;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1713 }
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1714
21139
538b57866b90 consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents: 21127
diff changeset
1715 template <typename NDA>
10756
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1716 static inline typename NDA::element_type
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1717 do_num2cell_elem (const NDA& array, octave_idx_type i)
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1718 { return array(i); }
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1719
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1720 static inline Cell
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1721 do_num2cell_elem (const Cell& array, octave_idx_type i)
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1722 { return Cell (array(i)); }
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1723
21139
538b57866b90 consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents: 21127
diff changeset
1724 template <typename NDA>
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1725 static Cell
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1726 do_num2cell (const NDA& array, const Array<int>& dimv)
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1727 {
23577
80c42f4cca13 maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents: 23576
diff changeset
1728 if (dimv.isempty ())
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1729 {
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1730 Cell retval (array.dims ());
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1731 octave_idx_type nel = array.numel ();
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1732 for (octave_idx_type i = 0; i < nel; i++)
10756
d808eb829d48 optimize num2cell on structs
Jaroslav Hajek <highegg@gmail.com>
parents: 10711
diff changeset
1733 retval.xelem (i) = do_num2cell_elem (array, i);
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1734
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1735 return retval;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1736 }
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1737 else
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1738 {
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1739 dim_vector celldv, arraydv;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1740 Array<int> perm;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1741 do_num2cell_helper (array.dims (), dimv, celldv, arraydv, perm);
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1742
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1743 NDA parray = array.permute (perm);
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1744
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17893
diff changeset
1745 octave_idx_type nela = arraydv.numel ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17893
diff changeset
1746 octave_idx_type nelc = celldv.numel ();
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1747 parray = parray.reshape (dim_vector (nela, nelc));
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1748
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1749 Cell retval (celldv);
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1750 for (octave_idx_type i = 0; i < nelc; i++)
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1751 {
9731
7b9cbaad68d6 extend Array<T>
Jaroslav Hajek <highegg@gmail.com>
parents: 9728
diff changeset
1752 retval.xelem (i) = NDA (parray.column (i).reshape (arraydv));
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1753 }
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1754
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1755 return retval;
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1756 }
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1757 }
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1758
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1759 // FIXME: this is a mess, but if a size method for the object exists,
13695
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1760 // we have to call it to get the size of the object instead of using the
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1761 // internal dims method.
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1762
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1763 static dim_vector
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1764 get_object_dims (octave_value& obj)
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1765 {
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1766 dim_vector retval;
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1767
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1768 Matrix m = obj.size ();
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1769
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1770 int n = m.numel ();
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1771
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1772 retval.resize (n);
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1773
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1774 for (int i = 0; i < n; i++)
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1775 retval(i) = m(i);
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1776
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1777 return retval;
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1778 }
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1779
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1780 static Cell
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1781 do_object2cell (const octave_value& obj, const Array<int>& dimv)
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1782 {
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1783 Cell retval;
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1784
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
1785 // FIXME: this copy is only needed because the octave_value::size
13695
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1786 // method is not const.
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1787 octave_value array = obj;
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1788
23577
80c42f4cca13 maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents: 23576
diff changeset
1789 if (! dimv.isempty ())
20962
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1790 error ("num2cell (A, dim) not implemented for class objects");
13695
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1791
20962
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1792 dim_vector dv = get_object_dims (array);
13695
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1793
20962
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1794 retval.resize (dv);
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1795
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1796 octave_value_list idx (1);
13695
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1797
20962
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1798 for (octave_idx_type i = 0; i < dv.numel (); i++)
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1799 {
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1800 octave_quit ();
13695
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1801
20962
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1802 idx(0) = double (i+1);
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1803
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20918
diff changeset
1804 retval.xelem (i) = array.single_subsref ("(", idx);
13695
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1805 }
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1806
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1807 return retval;
348857854c52 correctly handle multidimensional objects in num2cell
John W. Eaton <jwe@octave.org>
parents: 13329
diff changeset
1808 }
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1809
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
1810 DEFUN (num2cell, args, ,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1811 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1812 @deftypefn {} {@var{C} =} num2cell (@var{A})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1813 @deftypefnx {} {@var{C} =} num2cell (@var{A}, @var{dim})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1814 Convert the numeric matrix @var{A} to a cell array.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1815
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1816 When no @var{dim} is specified, each element of @var{A} becomes a 1x1 element
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1817 in the output @var{C}.
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1818
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1819 If @var{dim} is defined then individual elements of @var{C} contain all of the
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1820 elements from @var{A} along the specified dimension. @var{dim} may also be a
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1821 vector of dimensions with the same rule applied.
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1822
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1823 For example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1824
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1825 @example
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1826 x = [1,2;3,4]
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1827 @result{}
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1828 1 2
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1829 3 4
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1830
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1831 ## each element of A becomes a 1x1 element of C
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1832 num2cell (x)
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1833 @result{}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1834 @{
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1835 [1,1] = 1
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1836 [2,1] = 3
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1837 [1,2] = 2
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1838 [2,2] = 4
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1839 @}
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1840 ## all rows (dim 1) of A appear in each element of C
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1841 num2cell (x, 1)
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1842 @result{}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1843 @{
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1844 [1,1] =
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1845 1
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1846 3
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1847 [1,2] =
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1848 2
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1849 4
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1850 @}
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1851 ## all columns (dim 2) of A appear in each element of C
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1852 num2cell (x, 2)
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1853 @result{}
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1854 @{
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1855 [1,1] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1856 1 2
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1857 [2,1] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1858 3 4
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1859 @}
26577
ae1542fb58ba documentation: Avoid some overfull lines in the PDF manual.
Markus Mützel <markus.muetzel@gmx.de>
parents: 26376
diff changeset
1860 ## all rows and cols appear in each element of C
ae1542fb58ba documentation: Avoid some overfull lines in the PDF manual.
Markus Mützel <markus.muetzel@gmx.de>
parents: 26376
diff changeset
1861 ## (hence, only 1 output)
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1862 num2cell (x, [1, 2])
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1863 @result{}
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1864 @{
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1865 [1,1] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1866 1 2
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1867 3 4
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
1868 @}
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1869 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1870
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1871 @seealso{mat2cell}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
1872 @end deftypefn */)
5451
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1873 {
20897
9aad16a799c9 maint: Replace argc variable name with nargin in C++ code.
Rik <rik@octave.org>
parents: 20853
diff changeset
1874 int nargin = args.length ();
5451
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1875
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1876 if (nargin < 1 || nargin > 2)
5823
080c08b192d8 [project @ 2006-05-19 05:32:17 by jwe]
jwe
parents: 5784
diff changeset
1877 print_usage ();
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1878
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1879 octave_value retval;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
1880
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1881 octave_value array = args(0);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1882
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1883 Array<int> dimv;
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1884 if (nargin > 1)
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1885 dimv = args(1).int_vector_value (true);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1886
23579
c20a0fa91c0c maint: Deprecate is_bool_type and replace with islogical.
Rik <rik@octave.org>
parents: 23577
diff changeset
1887 if (array.islogical ())
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1888 retval = do_num2cell (array.bool_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1889 else if (array.is_char_matrix ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1890 retval = do_num2cell (array.char_array_value (), dimv);
23586
f6c5db0a02e7 maint: Deprecate is_numeric_type and replace with isnumeric.
Rik <rik@octave.org>
parents: 23584
diff changeset
1891 else if (array.isnumeric ())
5451
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1892 {
23580
2230f9e10fb3 maint: Deprecate is_integer_type and replace with isinteger.
Rik <rik@octave.org>
parents: 23579
diff changeset
1893 if (array.isinteger ())
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1894 {
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1895 if (array.is_int8_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1896 retval = do_num2cell (array.int8_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1897 else if (array.is_int16_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1898 retval = do_num2cell (array.int16_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1899 else if (array.is_int32_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1900 retval = do_num2cell (array.int32_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1901 else if (array.is_int64_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1902 retval = do_num2cell (array.int64_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1903 else if (array.is_uint8_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1904 retval = do_num2cell (array.uint8_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1905 else if (array.is_uint16_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1906 retval = do_num2cell (array.uint16_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1907 else if (array.is_uint32_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1908 retval = do_num2cell (array.uint32_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1909 else if (array.is_uint64_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1910 retval = do_num2cell (array.uint64_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1911 }
23581
c3075ae020e1 maint: Deprecate is_complex_type and replace with iscomplex.
Rik <rik@octave.org>
parents: 23580
diff changeset
1912 else if (array.iscomplex ())
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1913 {
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1914 if (array.is_single_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1915 retval = do_num2cell (array.float_complex_array_value (), dimv);
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1916 else
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1917 retval = do_num2cell (array.complex_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1918 }
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1919 else
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1920 {
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1921 if (array.is_single_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1922 retval = do_num2cell (array.float_array_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1923 else
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1924 retval = do_num2cell (array.array_value (), dimv);
9678
c929f09457b7 rewrite num2cell for speed-up + a few associated fixes
Jaroslav Hajek <highegg@gmail.com>
parents: 9622
diff changeset
1925 }
5451
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1926 }
23587
0c468af9dc00 maint: Deprecate is_object and replace with isobject.
Rik <rik@octave.org>
parents: 23586
diff changeset
1927 else if (array.isobject ())
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1928 retval = do_object2cell (array, dimv);
23584
7ed6b258db91 maint: Deprecate is_map and replace with isstruct.
Rik <rik@octave.org>
parents: 23583
diff changeset
1929 else if (array.isstruct ())
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1930 retval = do_num2cell (array.map_value (), dimv);
23576
00e518162fda maint: Deprecate is_cell and replace with iscell.
Rik <rik@octave.org>
parents: 23573
diff changeset
1931 else if (array.iscell ())
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1932 retval = do_num2cell (array.cell_value (), dimv);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
1933 else
21100
e39e05d90788 Switch gripe_XXX to either err_XXX or warn_XXX naming scheme.
Rik <rik@octave.org>
parents: 20980
diff changeset
1934 err_wrong_type_arg ("num2cell", array);
5451
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1935
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1936 return retval;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1937 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
1938
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
1939 /*
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1940 %!assert (num2cell ([1,2;3,4]), {1,2;3,4})
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1941 %!assert (num2cell ([1,2;3,4], 1), {[1;3],[2;4]})
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
1942 %!assert (num2cell ([1,2;3,4], 2), {[1,2];[3,4]})
5988
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
1943 */
d9ce802628e6 [project @ 2006-09-12 21:31:41 by dbateman]
dbateman
parents: 5829
diff changeset
1944
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
1945 static bool
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1946 mat2cell_mismatch (const dim_vector& dv,
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1947 const Array<octave_idx_type> *d, int nd)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1948 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1949 for (int i = 0; i < nd; i++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1950 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1951 octave_idx_type s = 0;
20232
a9574e3c6e9e Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents: 20172
diff changeset
1952 for (octave_idx_type j = 0; j < d[i].numel (); j++)
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1953 s += d[i](j);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1954
23450
855122b993da maint: Wrap tertiary operator in parentheses "(COND ? x : y)".
Rik <rik@octave.org>
parents: 23449
diff changeset
1955 octave_idx_type r = (i < dv.ndims () ? dv(i) : 1);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1956
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1957 if (s != r)
26164
7f6a50f73625 Silence compiler warnings about format identifier for octave_idx_type (bug #55046).
Markus Mützel <markus.muetzel@gmx.de>
parents: 25762
diff changeset
1958 error ("mat2cell: mismatch on dimension %d (%" OCTAVE_IDX_TYPE_FORMAT
7f6a50f73625 Silence compiler warnings about format identifier for octave_idx_type (bug #55046).
Markus Mützel <markus.muetzel@gmx.de>
parents: 25762
diff changeset
1959 " != %" OCTAVE_IDX_TYPE_FORMAT ")", i+1, r, s);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1960 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1961
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1962 return false;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1963 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1964
21139
538b57866b90 consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents: 21127
diff changeset
1965 template <typename container>
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
1966 static void
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1967 prepare_idx (container *idx, int idim, int nd,
30390
a61e1a0f6024 maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents: 30323
diff changeset
1968 const Array<octave_idx_type> *d)
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1969 {
23450
855122b993da maint: Wrap tertiary operator in parentheses "(COND ? x : y)".
Rik <rik@octave.org>
parents: 23449
diff changeset
1970 octave_idx_type nidx = (idim < nd ? d[idim].numel () : 1);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1971 if (nidx == 1)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1972 idx[0] = idx_vector::colon;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1973 else
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1974 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1975 octave_idx_type l = 0;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1976 for (octave_idx_type i = 0; i < nidx; i++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1977 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1978 octave_idx_type u = l + d[idim](i);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1979 idx[i] = idx_vector (l, u);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1980 l = u;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1981 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1982 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1983 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1984
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1985 // 2D specialization, works for Array, Sparse and octave_map.
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1986 // Uses 1D or 2D indexing.
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1987
21139
538b57866b90 consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents: 21127
diff changeset
1988 template <typename Array2D>
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1989 static Cell
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1990 do_mat2cell_2d (const Array2D& a, const Array<octave_idx_type> *d, int nd)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1991 {
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
1992 Cell retval;
30723
08b08b7f05b2 Replace direct calls to C library assert() with Octave specialty functions in libinterp/ (bug #61753)
Arun Giridhar <arungiridhar@gmail.com> and Rik <rik@octave.org>
parents: 30565
diff changeset
1993 error_unless (nd == 1 || nd == 2);
08b08b7f05b2 Replace direct calls to C library assert() with Octave specialty functions in libinterp/ (bug #61753)
Arun Giridhar <arungiridhar@gmail.com> and Rik <rik@octave.org>
parents: 30565
diff changeset
1994 error_unless (a.ndims () == 2);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1995
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1996 if (mat2cell_mismatch (a.dims (), d, nd))
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1997 return retval;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
1998
20232
a9574e3c6e9e Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents: 20172
diff changeset
1999 octave_idx_type nridx = d[0].numel ();
23450
855122b993da maint: Wrap tertiary operator in parentheses "(COND ? x : y)".
Rik <rik@octave.org>
parents: 23449
diff changeset
2000 octave_idx_type ncidx = (nd == 1 ? 1 : d[1].numel ());
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2001 retval.clear (nridx, ncidx);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2002
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2003 int ivec = -1;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2004 if (a.rows () > 1 && a.cols () == 1 && ncidx == 1)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2005 ivec = 0;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2006 else if (a.rows () == 1 && nridx == 1 && nd == 2)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2007 ivec = 1;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2008
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2009 if (ivec >= 0)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2010 {
21751
b571fc85953f maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents: 21743
diff changeset
2011 // Vector split. Use 1D indexing.
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17893
diff changeset
2012 octave_idx_type l = 0;
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17893
diff changeset
2013 octave_idx_type nidx = (ivec == 0 ? nridx : ncidx);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2014 for (octave_idx_type i = 0; i < nidx; i++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2015 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2016 octave_idx_type u = l + d[ivec](i);
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2017 retval.xelem (i) = a.index (idx_vector (l, u));
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2018 l = u;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2019 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2020 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2021 else
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2022 {
21751
b571fc85953f maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents: 21743
diff changeset
2023 // General 2D case. Use 2D indexing.
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2024 OCTAVE_LOCAL_BUFFER (idx_vector, ridx, nridx);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2025 prepare_idx (ridx, 0, nd, d);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2026
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2027 OCTAVE_LOCAL_BUFFER (idx_vector, cidx, ncidx);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2028 prepare_idx (cidx, 1, nd, d);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2029
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2030 for (octave_idx_type j = 0; j < ncidx; j++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2031 for (octave_idx_type i = 0; i < nridx; i++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2032 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2033 octave_quit ();
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2034
30390
a61e1a0f6024 maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents: 30323
diff changeset
2035 retval.xelem (i, j) = a.index (ridx[i], cidx[j]);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2036 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2037 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2038
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2039 return retval;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2040 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2041
21751
b571fc85953f maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents: 21743
diff changeset
2042 // Nd case. Works for Arrays and octave_map.
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2043 // Uses Nd indexing.
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2044
21139
538b57866b90 consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents: 21127
diff changeset
2045 template <typename ArrayND>
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2046 Cell
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2047 do_mat2cell_nd (const ArrayND& a, const Array<octave_idx_type> *d, int nd)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2048 {
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2049 Cell retval;
30723
08b08b7f05b2 Replace direct calls to C library assert() with Octave specialty functions in libinterp/ (bug #61753)
Arun Giridhar <arungiridhar@gmail.com> and Rik <rik@octave.org>
parents: 30565
diff changeset
2050 error_unless (nd >= 1);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2051
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2052 if (mat2cell_mismatch (a.dims (), d, nd))
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2053 return retval;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2054
31842
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2055 bool is_1d = false;
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2056 if (nd < 2)
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2057 {
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2058 // work with 2d matrix
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2059 is_1d = true;
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2060 nd = 2;
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2061 }
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2062
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2063 // vector with number of splits in respective dimension
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2064 dim_vector rdv = dim_vector::alloc (nd);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2065 OCTAVE_LOCAL_BUFFER (octave_idx_type, nidx, nd);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2066 octave_idx_type idxtot = 0;
31842
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2067 for (int i = 0; i < (is_1d ? 1 : nd); i++)
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2068 {
20232
a9574e3c6e9e Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents: 20172
diff changeset
2069 rdv(i) = nidx[i] = d[i].numel ();
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2070 idxtot += nidx[i];
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2071 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2072
31842
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2073 if (is_1d)
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2074 {
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2075 // If input was 1d, don't split 2nd dimension.
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2076 rdv(1) = nidx[1] = 1;
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2077 idxtot++;
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2078 }
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2079 retval.clear (rdv);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2080
31842
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2081 // buffer for "linearized" number of dimensions
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2082 OCTAVE_LOCAL_BUFFER (idx_vector, xidx, idxtot);
31842
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2083 // buffer with size of respective dimensions after split
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2084 OCTAVE_LOCAL_BUFFER (idx_vector *, idx, nd);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2085
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2086 idxtot = 0;
31842
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2087 for (int i = 0; i < (is_1d ? 1 : nd); i++)
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2088 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2089 idx[i] = xidx + idxtot;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2090 prepare_idx (idx[i], i, nd, d);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2091 idxtot += nidx[i];
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2092 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2093
31842
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2094 if (is_1d)
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2095 {
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2096 // If input was 1d, take complete second dimension.
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2097 idx[1] = xidx + idxtot;
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2098 idx[1][0] = idx_vector::colon;
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2099 }
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2100
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2101 OCTAVE_LOCAL_BUFFER_INIT (octave_idx_type, ridx, nd, 0);
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2102 Array<idx_vector> ra_idx
31607
aac27ad79be6 maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents: 31605
diff changeset
2103 (dim_vector (1, std::max (nd, a.ndims ())), idx_vector::colon);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2104
31842
79abf4cdcd95 mat2cell: Next attempt to avoid heap buffer overflow (bug #63682).
Markus Mützel <markus.muetzel@gmx.de>
parents: 31841
diff changeset
2105 for (octave_idx_type j = 0; j < nd; j++)
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2106 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2107 octave_quit ();
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2108
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2109 for (int i = 0; i < nd; i++)
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2110 ra_idx.xelem (i) = idx[i][ridx[i]];
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2111
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2112 retval.xelem (j) = a.index (ra_idx);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2113
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2114 rdv.increment_index (ridx);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2115 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2116
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2117 return retval;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2118 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2119
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2120 // Dispatcher.
21139
538b57866b90 consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents: 21127
diff changeset
2121 template <typename ArrayND>
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2122 Cell
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2123 do_mat2cell (const ArrayND& a, const Array<octave_idx_type> *d, int nd)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2124 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2125 if (a.ndims () == 2 && nd <= 2)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2126 return do_mat2cell_2d (a, d, nd);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2127 else
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2128 return do_mat2cell_nd (a, d, nd);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2129 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2130
21751
b571fc85953f maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents: 21743
diff changeset
2131 // General case. Works for any class supporting do_index_op.
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2132 // Uses Nd indexing.
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2133
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2134 Cell
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2135 do_mat2cell (octave_value& a, const Array<octave_idx_type> *d, int nd)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2136 {
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2137 Cell retval;
30723
08b08b7f05b2 Replace direct calls to C library assert() with Octave specialty functions in libinterp/ (bug #61753)
Arun Giridhar <arungiridhar@gmail.com> and Rik <rik@octave.org>
parents: 30565
diff changeset
2138 error_unless (nd >= 1);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2139
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2140 if (mat2cell_mismatch (a.dims (), d, nd))
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2141 return retval;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2142
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2143 dim_vector rdv = dim_vector::alloc (nd);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2144 OCTAVE_LOCAL_BUFFER (octave_idx_type, nidx, nd);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2145 octave_idx_type idxtot = 0;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2146 for (int i = 0; i < nd; i++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2147 {
20232
a9574e3c6e9e Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents: 20172
diff changeset
2148 rdv(i) = nidx[i] = d[i].numel ();
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2149 idxtot += nidx[i];
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2150 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2151
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2152 retval.clear (rdv);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2153
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2154 OCTAVE_LOCAL_BUFFER (octave_value, xidx, idxtot);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2155 OCTAVE_LOCAL_BUFFER (octave_value *, idx, nd);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2156
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2157 idxtot = 0;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2158 for (int i = 0; i < nd; i++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2159 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2160 idx[i] = xidx + idxtot;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2161 prepare_idx (idx[i], i, nd, d);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2162 idxtot += nidx[i];
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2163 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2164
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2165 OCTAVE_LOCAL_BUFFER_INIT (octave_idx_type, ridx, nd, 0);
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
2166 octave_value_list ra_idx (std::max (nd, a.ndims ()),
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2167 octave_value::magic_colon_t);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2168
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2169 for (octave_idx_type j = 0; j < retval.numel (); j++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2170 {
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2171 octave_quit ();
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2172
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2173 for (int i = 0; i < nd; i++)
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2174 ra_idx(i) = idx[i][ridx[i]];
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2175
28631
70cdf8de553d move non-member octave_value operator functions to octave namespace
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
2176 retval.xelem (j) = a.index_op (ra_idx);
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2177
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2178 rdv.increment_index (ridx);
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2179 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2180
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2181 return retval;
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2182 }
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2183
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
2184 DEFUN (mat2cell, args, ,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2185 doc: /* -*- texinfo -*-
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2186 @deftypefn {} {@var{C} =} mat2cell (@var{A}, @var{dim1}, @var{dim2}, @dots{}, @var{dimi}, @dots{}, @var{dimn})
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2187 @deftypefnx {} {@var{C} =} mat2cell (@var{A}, @var{rowdim})
31817
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2188 Convert the matrix @var{A} to a cell array @var{C}.
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2189
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2190 Each dimension argument (@var{dim1}, @var{dim2}, etc.@:) is a vector of
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2191 integers which specifies how to divide that dimension's elements amongst the
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2192 new elements in the output @var{C}. The number of elements in the @var{i}-th
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2193 dimension is @code{size (@var{A}, @var{i})}. Because all elements in @var{A}
26963
589b00536a39 doc: Small fixes to mat2cell and polyeig docstrings (bug #55985).
Rik <rik@octave.org>
parents: 26577
diff changeset
2194 must be partitioned, there is a requirement that @code{sum (@var{dimi}) == size
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2195 (@var{A}, i)}. The size of the output cell @var{C} is numel (@var{dim1}) x
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2196 numel (@var{dim2}) x @dots{} x numel (@var{dimn}).
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2197
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2198 Given a single dimensional argument, @var{rowdim}, the output is divided into
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2199 rows as specified. All other dimensions are not divided and thus all
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2200 columns (dim 2), pages (dim 3), etc.@: appear in each output element.
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2201
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2202 Examples
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2203
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2204 @example
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2205 x = reshape (1:12, [3, 4])'
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2206 @result{}
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2207 1 2 3
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2208 4 5 6
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2209 7 8 9
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2210 10 11 12
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2211
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2212 @group
26577
ae1542fb58ba documentation: Avoid some overfull lines in the PDF manual.
Markus Mützel <markus.muetzel@gmx.de>
parents: 26376
diff changeset
2213 ## The 4 rows (dim1) are divided in to two cell elements
ae1542fb58ba documentation: Avoid some overfull lines in the PDF manual.
Markus Mützel <markus.muetzel@gmx.de>
parents: 26376
diff changeset
2214 ## with 2 rows each.
ae1542fb58ba documentation: Avoid some overfull lines in the PDF manual.
Markus Mützel <markus.muetzel@gmx.de>
parents: 26376
diff changeset
2215 ## The 3 cols (dim2) are divided in to three cell elements
ae1542fb58ba documentation: Avoid some overfull lines in the PDF manual.
Markus Mützel <markus.muetzel@gmx.de>
parents: 26376
diff changeset
2216 ## with 1 col each.
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2217 mat2cell (x, [2,2], [1,1,1])
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2218 @result{}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2219 @{
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2220 [1,1] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2221
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2222 1
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2223 4
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2224
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2225 [2,1] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2226
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2227 7
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2228 10
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2229
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2230 [1,2] =
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2231
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2232 2
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2233 5
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2234
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2235 [2,2] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2236 8
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2237 11
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2238
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2239 [1,3] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2240
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2241 3
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2242 6
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2243
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2244 [2,3] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2245 9
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2246 12
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2247 @}
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2248 @end group
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2249
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2250 @group
26577
ae1542fb58ba documentation: Avoid some overfull lines in the PDF manual.
Markus Mützel <markus.muetzel@gmx.de>
parents: 26376
diff changeset
2251 ## The 4 rows (dim1) are divided in to two cell elements
ae1542fb58ba documentation: Avoid some overfull lines in the PDF manual.
Markus Mützel <markus.muetzel@gmx.de>
parents: 26376
diff changeset
2252 ## with a 3/1 split.
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2253 ## All columns appear in each output element.
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2254 mat2cell (x, [3,1])
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2255 @result{}
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2256 @{
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2257 [1,1] =
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2258
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2259 1 2 3
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2260 4 5 6
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2261 7 8 9
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2262
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2263 [2,1] =
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2264
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2265 10 11 12
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2266 @}
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2267 @end group
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2268 @end example
26165
b326eeae92d0 doc: Rewrite docstrings for mat2cell and num2cell (bug #53335).
Rik <rik@octave.org>
parents: 25103
diff changeset
2269
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2270 @seealso{num2cell, cell2mat}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2271 @end deftypefn */)
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2272 {
14846
460a3c6d8bf1 maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents: 14501
diff changeset
2273 int nargin = args.length ();
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2274
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2275 if (nargin < 2)
7038
4482ba9814b7 [project @ 2007-10-19 16:05:48 by jwe]
jwe
parents: 7017
diff changeset
2276 print_usage ();
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2277
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
2278 octave_value retval;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
2279
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2280 // Prepare indices.
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2281 OCTAVE_LOCAL_BUFFER (Array<octave_idx_type>, d, nargin-1);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2282
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2283 for (int i = 1; i < nargin; i++)
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2284 d[i-1] = args(i).octave_idx_type_vector_value (true);
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2285
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2286 octave_value a = args(0);
23583
b7747a2c88b2 maint: Deprecate is_sparse_type and replace with issparse.
Rik <rik@octave.org>
parents: 23582
diff changeset
2287 bool sparse = a.issparse ();
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2288 if (sparse && nargin > 3)
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2289 error ("mat2cell: sparse arguments only support 2-D indexing");
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2290
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2291 switch (a.builtin_type ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2292 {
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2293 case btyp_double:
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2294 {
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2295 if (sparse)
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2296 retval = do_mat2cell_2d (a.sparse_matrix_value (), d, nargin-1);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2297 else
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2298 retval = do_mat2cell (a.array_value (), d, nargin - 1);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2299 }
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2300 break;
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2301
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2302 case btyp_complex:
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2303 {
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2304 if (sparse)
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2305 retval = do_mat2cell_2d (a.sparse_complex_matrix_value (), d,
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2306 nargin-1);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2307 else
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2308 retval = do_mat2cell (a.complex_array_value (), d, nargin - 1);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2309 }
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2310 break;
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2311
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2312 #define BTYP_BRANCH(X, Y) \
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2313 case btyp_ ## X: \
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2314 retval = do_mat2cell (a.Y ## _value (), d, nargin - 1); \
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2315 break
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2316
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2317 BTYP_BRANCH (float, float_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2318 BTYP_BRANCH (float_complex, float_complex_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2319 BTYP_BRANCH (bool, bool_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2320 BTYP_BRANCH (char, char_array);
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2321
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2322 BTYP_BRANCH (int8, int8_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2323 BTYP_BRANCH (int16, int16_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2324 BTYP_BRANCH (int32, int32_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2325 BTYP_BRANCH (int64, int64_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2326 BTYP_BRANCH (uint8, uint8_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2327 BTYP_BRANCH (uint16, uint16_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2328 BTYP_BRANCH (uint32, uint32_array);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2329 BTYP_BRANCH (uint64, uint64_array);
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2330
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2331 BTYP_BRANCH (cell, cell);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2332 BTYP_BRANCH (struct, map);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2333
10786
146a97c3bc97 some optimizations for mat2cell
Jaroslav Hajek <highegg@gmail.com>
parents: 10756
diff changeset
2334 #undef BTYP_BRANCH
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2335
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2336 case btyp_func_handle:
21100
e39e05d90788 Switch gripe_XXX to either err_XXX or warn_XXX naming scheme.
Rik <rik@octave.org>
parents: 20980
diff changeset
2337 err_wrong_type_arg ("mat2cell", a);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2338 break;
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2339
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2340 default:
31816
60c072f42338 Backed out changeset 8c57434587c9 (bug #63682)
Rik <rik@octave.org>
parents: 31763
diff changeset
2341 retval = do_mat2cell (a, d, nargin-1);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2342 break;
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2343 }
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2344
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2345 return retval;
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2346 }
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2347
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2348 /*
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
2349 %!test
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
2350 %! x = reshape (1:20, 5, 4);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
2351 %! c = mat2cell (x, [3,2], [3,1]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
2352 %! assert (c, {[1,6,11;2,7,12;3,8,13],[16;17;18];[4,9,14;5,10,15],[19;20]});
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2353
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2354 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
2355 %! x = "abcdefghij";
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
2356 %! c = mat2cell (x, 1, [0,4,2,0,4,0]);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
2357 %! empty1by0str = resize ("", 1, 0);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14366
diff changeset
2358 %! assert (c, {empty1by0str,"abcd","ef",empty1by0str,"ghij",empty1by0str});
31817
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2359
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2360 ## Omitted input for trailing dimensions means not splitting on them.
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2361 %!test <*63682>
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2362 %! x = reshape (1:16, 4, 2, 2);
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2363 %! c1 = mat2cell (x, [2, 2], 2, 2);
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2364 %! c2 = mat2cell (x, [2, 2]);
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2365 %! assert (c1, c2);
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2366 %! assert (c1, {cat(3, [1,5;2,6], [9,13;10,14]); ...
90ce081eb281 Fix mat2cell for N-D array input with only one output dimension (bug #63682)
Rik <rik@octave.org>
parents: 31816
diff changeset
2367 %! cat(3, [3,7;4,8], [11,15;12,16])});
5784
70f7659d0fb9 [project @ 2006-05-03 05:55:56 by dbateman]
dbateman
parents: 5642
diff changeset
2368 */
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2369
9740
78ac37d73557 fix cellslices to handle empty ranges with non-positive bounds
Jaroslav Hajek <highegg@gmail.com>
parents: 9731
diff changeset
2370 // FIXME: it would be nice to allow ranges being handled without a conversion.
21139
538b57866b90 consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents: 21127
diff changeset
2371 template <typename NDA>
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
2372 static Cell
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
2373 do_cellslices_nda (const NDA& array,
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
2374 const Array<octave_idx_type>& lb,
10125
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2375 const Array<octave_idx_type>& ub,
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2376 int dim = -1)
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2377 {
20232
a9574e3c6e9e Deprecate Array::length() and Sparse::length() in favour of ::numel().
Carnë Draug <carandraug@octave.org>
parents: 20172
diff changeset
2378 octave_idx_type n = lb.numel ();
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2379 Cell retval (1, n);
23592
80e3bfb7bd5a maint: Deprecate is_vector and replace with isvector.
Rik <rik@octave.org>
parents: 23587
diff changeset
2380 if (array.isvector () && (dim == -1
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2381 || (dim == 0 && array.columns () == 1)
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2382 || (dim == 1 && array.rows () == 1)))
9057
8b263623d0f3 have cellslices index the last dim of n-d arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 9042
diff changeset
2383 {
20560
56fee8f84fe7 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20535
diff changeset
2384 for (octave_idx_type i = 0; i < n; i++)
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2385 retval.xelem (i) = array.index (idx_vector (lb(i) - 1, ub(i)));
9057
8b263623d0f3 have cellslices index the last dim of n-d arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 9042
diff changeset
2386 }
8b263623d0f3 have cellslices index the last dim of n-d arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 9042
diff changeset
2387 else
8b263623d0f3 have cellslices index the last dim of n-d arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 9042
diff changeset
2388 {
10125
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2389 const dim_vector dv = array.dims ();
21660
53728df3e4c9 maint: for clarity, call ndims() rather than length() on dimension vectors.
Rik <rik@octave.org>
parents: 21581
diff changeset
2390 int ndims = dv.ndims ();
10125
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2391 if (dim < 0)
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2392 dim = dv.first_non_singleton ();
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2393 ndims = std::max (ndims, dim + 1);
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2394
11570
57632dea2446 attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents: 11553
diff changeset
2395 Array<idx_vector> idx (dim_vector (ndims, 1), idx_vector::colon);
10125
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2396
20560
56fee8f84fe7 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20535
diff changeset
2397 for (octave_idx_type i = 0; i < n; i++)
9057
8b263623d0f3 have cellslices index the last dim of n-d arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 9042
diff changeset
2398 {
10125
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2399 idx(dim) = idx_vector (lb(i) - 1, ub(i));
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2400 retval.xelem (i) = array.index (idx);
9057
8b263623d0f3 have cellslices index the last dim of n-d arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 9042
diff changeset
2401 }
8b263623d0f3 have cellslices index the last dim of n-d arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 9042
diff changeset
2402 }
8b263623d0f3 have cellslices index the last dim of n-d arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 9042
diff changeset
2403
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2404 return retval;
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2405 }
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2406
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
2407 DEFUN (cellslices, args, ,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2408 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2409 @deftypefn {} {@var{sl} =} cellslices (@var{x}, @var{lb}, @var{ub}, @var{dim})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2410 Given an array @var{x}, this function produces a cell array of slices from
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2411 the array determined by the index vectors @var{lb}, @var{ub}, for lower and
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2412 upper bounds, respectively.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2413
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2414 In other words, it is equivalent to the following code:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2415
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2416 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2417 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2418 n = length (lb);
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2419 sl = cell (1, n);
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2420 for i = 1:length (lb)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2421 sl@{i@} = x(:,@dots{},lb(i):ub(i),@dots{},:);
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2422 endfor
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2423 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2424 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2425
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2426 The position of the index is determined by @var{dim}. If not specified,
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2427 slicing is done along the first non-singleton dimension.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2428 @seealso{cell2mat, cellindexmat, cellfun}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2429 @end deftypefn */)
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2430 {
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2431 int nargin = args.length ();
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2432
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2433 if (nargin < 3 || nargin > 4)
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2434 print_usage ();
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2435
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2436 octave_value x = args(0);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2437 Array<octave_idx_type> lb = args(1).octave_idx_type_vector_value ();
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2438 Array<octave_idx_type> ub = args(2).octave_idx_type_vector_value ();
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2439 int dim = -1;
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2440 if (nargin == 4)
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2441 {
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2442 dim = args(3).int_value () - 1;
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2443 if (dim < 0)
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2444 error ("cellslices: DIM must be a valid dimension");
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2445 }
10125
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2446
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2447 if (lb.numel () != ub.numel ())
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2448 error ("cellslices: the lengths of LB and UB must match");
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2449
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2450 Cell retcell;
23583
b7747a2c88b2 maint: Deprecate is_sparse_type and replace with issparse.
Rik <rik@octave.org>
parents: 23582
diff changeset
2451 if (! x.issparse () && x.is_matrix_type ())
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2452 {
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2453 // specialize for some dense arrays.
23579
c20a0fa91c0c maint: Deprecate is_bool_type and replace with islogical.
Rik <rik@octave.org>
parents: 23577
diff changeset
2454 if (x.islogical ())
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2455 retcell = do_cellslices_nda (x.bool_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2456 lb, ub, dim);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2457 else if (x.is_char_matrix ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2458 retcell = do_cellslices_nda (x.char_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2459 lb, ub, dim);
23580
2230f9e10fb3 maint: Deprecate is_integer_type and replace with isinteger.
Rik <rik@octave.org>
parents: 23579
diff changeset
2460 else if (x.isinteger ())
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2461 {
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2462 if (x.is_int8_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2463 retcell = do_cellslices_nda (x.int8_array_value (),
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2464 lb, ub, dim);
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2465 else if (x.is_int16_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2466 retcell = do_cellslices_nda (x.int16_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2467 lb, ub, dim);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2468 else if (x.is_int32_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2469 retcell = do_cellslices_nda (x.int32_array_value (),
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2470 lb, ub, dim);
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2471 else if (x.is_int64_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2472 retcell = do_cellslices_nda (x.int64_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2473 lb, ub, dim);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2474 else if (x.is_uint8_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2475 retcell = do_cellslices_nda (x.uint8_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2476 lb, ub, dim);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2477 else if (x.is_uint16_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2478 retcell = do_cellslices_nda (x.uint16_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2479 lb, ub, dim);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2480 else if (x.is_uint32_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2481 retcell = do_cellslices_nda (x.uint32_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2482 lb, ub, dim);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2483 else if (x.is_uint64_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2484 retcell = do_cellslices_nda (x.uint64_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2485 lb, ub, dim);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2486 }
23581
c3075ae020e1 maint: Deprecate is_complex_type and replace with iscomplex.
Rik <rik@octave.org>
parents: 23580
diff changeset
2487 else if (x.iscomplex ())
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2488 {
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2489 if (x.is_single_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2490 retcell = do_cellslices_nda (x.float_complex_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2491 lb, ub, dim);
20560
56fee8f84fe7 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20535
diff changeset
2492 else
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2493 retcell = do_cellslices_nda (x.complex_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2494 lb, ub, dim);
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2495 }
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2496 else
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2497 {
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2498 if (x.is_single_type ())
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2499 retcell = do_cellslices_nda (x.float_array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2500 lb, ub, dim);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2501 else
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2502 retcell = do_cellslices_nda (x.array_value (),
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2503 lb, ub, dim);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2504 }
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2505 }
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2506 else
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2507 {
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2508 // generic code.
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2509 octave_idx_type n = lb.numel ();
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2510 retcell = Cell (1, n);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2511 const dim_vector dv = x.dims ();
21660
53728df3e4c9 maint: for clarity, call ndims() rather than length() on dimension vectors.
Rik <rik@octave.org>
parents: 21581
diff changeset
2512 int ndims = dv.ndims ();
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2513 if (dim < 0)
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2514 dim = dv.first_non_singleton ();
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2515 ndims = std::max (ndims, dim + 1);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2516 octave_value_list idx (ndims, octave_value::magic_colon_t);
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2517 for (octave_idx_type i = 0; i < n; i++)
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2518 {
29961
7d6709900da7 eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
2519 idx(dim) = range<double> (lb(i), ub(i));
28631
70cdf8de553d move non-member octave_value operator functions to octave namespace
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
2520 retcell.xelem (i) = x.index_op (idx);
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20804
diff changeset
2521 }
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2522 }
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2523
21127
df7891224709 maint: Use "return ovl (...)" in DEFUN macros.
Rik <rik@octave.org>
parents: 21100
diff changeset
2524 return ovl (retcell);
8985
193804a4f82f add cellslices function
Jaroslav Hajek <highegg@gmail.com>
parents: 8920
diff changeset
2525 }
10122
9d1a14e12431 Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents: 10075
diff changeset
2526
9d1a14e12431 Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents: 10075
diff changeset
2527 /*
9d1a14e12431 Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents: 10075
diff changeset
2528 %!test
9d1a14e12431 Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents: 10075
diff changeset
2529 %! m = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12];
10125
82ed1b4c3011 improve cellslices
Jaroslav Hajek <highegg@gmail.com>
parents: 10122
diff changeset
2530 %! c = cellslices (m, [1, 2], [2, 3], 2);
10122
9d1a14e12431 Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents: 10075
diff changeset
2531 %! assert (c, {[1, 2; 5, 6; 9, 10], [2, 3; 6, 7; 10, 11]});
9d1a14e12431 Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents: 10075
diff changeset
2532 */
10963
0d7624852beb implement cellindexmat function
Jaroslav Hajek <highegg@gmail.com>
parents: 10846
diff changeset
2533
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
2534 DEFUN (cellindexmat, args, ,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2535 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2536 @deftypefn {} {@var{y} =} cellindexmat (@var{x}, @var{varargin})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2537 Perform indexing of matrices in a cell array.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2538
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2539 Given a cell array of matrices @var{x}, this function computes
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2540
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2541 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2542 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2543 Y = cell (size (X));
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2544 for i = 1:numel (X)
22716
c2f0e687471e doc: Improve docstring for cellindexmat().
Rik <rik@octave.org>
parents: 22699
diff changeset
2545 Y@{i@} = X@{i@}(varargin@{1@}, varargin@{2@}, @dots{}, varargin@{N@});
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2546 endfor
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2547 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2548 @end example
22716
c2f0e687471e doc: Improve docstring for cellindexmat().
Rik <rik@octave.org>
parents: 22699
diff changeset
2549
c2f0e687471e doc: Improve docstring for cellindexmat().
Rik <rik@octave.org>
parents: 22699
diff changeset
2550 The indexing arguments may be scalar (@code{2}), arrays (@code{[1, 3]}),
c2f0e687471e doc: Improve docstring for cellindexmat().
Rik <rik@octave.org>
parents: 22699
diff changeset
2551 ranges (@code{1:3}), or the colon operator (@qcode{":"}). However, the
c2f0e687471e doc: Improve docstring for cellindexmat().
Rik <rik@octave.org>
parents: 22699
diff changeset
2552 indexing keyword @code{end} is not available.
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2553 @seealso{cellslices, cellfun}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2554 @end deftypefn */)
10963
0d7624852beb implement cellindexmat function
Jaroslav Hajek <highegg@gmail.com>
parents: 10846
diff changeset
2555 {
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2556 if (args.length () == 0)
10963
0d7624852beb implement cellindexmat function
Jaroslav Hajek <highegg@gmail.com>
parents: 10846
diff changeset
2557 print_usage ();
0d7624852beb implement cellindexmat function
Jaroslav Hajek <highegg@gmail.com>
parents: 10846
diff changeset
2558
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2559 const Cell x = args(0).xcell_value ("cellindexmat: X must be a cell");
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20897
diff changeset
2560
27666
3e8faed1b7d8 Remove wrapper template class NoAlias<T> (bug #56752)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 27474
diff changeset
2561 Cell y (x.dims ());
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2562 octave_idx_type nel = x.numel ();
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2563 octave_value_list idx = args.slice (1, args.length () - 1);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2564
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2565 for (octave_idx_type i = 0; i < nel; i++)
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2566 {
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2567 octave_quit ();
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2568
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2569 octave_value tmp = x(i);
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2570
28631
70cdf8de553d move non-member octave_value operator functions to octave namespace
John W. Eaton <jwe@octave.org>
parents: 28427
diff changeset
2571 y.xelem (i) = tmp.index_op (idx);
20804
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2572 }
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2573
a6eaedd8bd75 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
2574 return octave_value (y);
10963
0d7624852beb implement cellindexmat function
Jaroslav Hajek <highegg@gmail.com>
parents: 10846
diff changeset
2575 }
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29655
diff changeset
2576
31605
e88a07dec498 maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents: 31105
diff changeset
2577 OCTAVE_END_NAMESPACE(octave)