Mercurial > octave
annotate src/DLD-FUNCTIONS/bsxfun.cc @ 9450:cf714e75c656
implement overloaded function handles
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Thu, 23 Jul 2009 14:44:30 +0200 |
parents | 853f96e8008f |
children | 26abff55f6fe |
rev | line source |
---|---|
6869 | 1 /* |
2 | |
8920 | 3 Copyright (C) 2007, 2008, 2009 David Bateman |
6869 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
6869 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
6869 | 20 |
21 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
24 #include <config.h> | |
25 #endif | |
26 | |
27 #include <string> | |
28 #include <vector> | |
29 #include <list> | |
30 | |
31 #include "lo-mappers.h" | |
32 | |
33 #include "oct-map.h" | |
34 #include "defun-dld.h" | |
35 #include "parse.h" | |
36 #include "variables.h" | |
37 #include "ov-colon.h" | |
38 #include "unwind-prot.h" | |
39 | |
40 static bool | |
41 maybe_update_column (octave_value& Ac, const octave_value& A, | |
42 const dim_vector& dva, const dim_vector& dvc, | |
43 octave_idx_type i, octave_value_list &idx) | |
44 { | |
45 octave_idx_type nd = dva.length (); | |
46 | |
47 if (i == 0) | |
48 { | |
49 idx(0) = octave_value (':'); | |
50 for (octave_idx_type j = 1; j < nd; j++) | |
51 { | |
52 if (dva (j) == 1) | |
53 idx (j) = octave_value (1); | |
54 else | |
55 idx (j) = octave_value ((i % dvc(j)) + 1); | |
56 | |
57 i = i / dvc (j); | |
58 } | |
59 | |
60 Ac = A; | |
61 Ac = Ac.single_subsref ("(", idx); | |
62 return true; | |
63 } | |
64 else | |
65 { | |
66 bool is_changed = false; | |
67 octave_idx_type k = i; | |
68 octave_idx_type k1 = i - 1; | |
69 for (octave_idx_type j = 1; j < nd; j++) | |
70 { | |
71 if (dva(j) != 1 && k % dvc (j) != k1 % dvc (j)) | |
72 { | |
73 idx (j) = octave_value ((k % dvc(j)) + 1); | |
74 is_changed = true; | |
75 } | |
76 | |
77 k = k / dvc (j); | |
78 k1 = k1 / dvc (j); | |
79 } | |
80 | |
81 if (is_changed) | |
82 { | |
83 Ac = A; | |
84 Ac = Ac.single_subsref ("(", idx); | |
85 return true; | |
86 } | |
87 else | |
88 return false; | |
89 } | |
90 } | |
91 | |
6959 | 92 #if 0 |
93 // FIXME -- this function is not used; is it OK to delete it? | |
6869 | 94 static void |
95 update_index (octave_value_list& idx, const dim_vector& dv, octave_idx_type i) | |
96 { | |
97 octave_idx_type nd = dv.length (); | |
98 | |
99 if (i == 0) | |
100 { | |
101 for (octave_idx_type j = nd - 1; j > 0; j--) | |
102 idx(j) = octave_value (static_cast<double>(1)); | |
103 idx(0) = octave_value (':'); | |
104 } | |
105 else | |
106 { | |
107 for (octave_idx_type j = 1; j < nd; j++) | |
108 { | |
109 idx (j) = octave_value (i % dv (j) + 1); | |
110 i = i / dv (j); | |
111 } | |
112 } | |
113 } | |
6959 | 114 #endif |
6869 | 115 |
116 static void | |
117 update_index (Array<int>& idx, const dim_vector& dv, octave_idx_type i) | |
118 { | |
119 octave_idx_type nd = dv.length (); | |
120 | |
121 idx(0) = 0; | |
122 for (octave_idx_type j = 1; j < nd; j++) | |
123 { | |
124 idx (j) = i % dv (j); | |
125 i = i / dv (j); | |
126 } | |
127 } | |
128 | |
6959 | 129 DEFUN_DLD (bsxfun, args, , |
8715 | 130 "-*- texinfo -*-\n\ |
7001 | 131 @deftypefn {Loadable Function} {} bsxfun (@var{f}, @var{a}, @var{b})\n\ |
6869 | 132 Applies a binary function @var{f} element-wise to two matrix arguments\n\ |
9041
853f96e8008f
Cleanup documentation file matrix.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
133 @var{a} and @var{b}. The function @var{f} must be capable of accepting\n\ |
6869 | 134 two column vector arguments of equal length, or one column vector\n\ |
135 argument and a scalar.\n\ | |
136 \n\ | |
9041
853f96e8008f
Cleanup documentation file matrix.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
137 The dimensions of @var{a} and @var{b} must be equal or singleton. The\n\ |
7001 | 138 singleton dimensions of the matrices will be expanded to the same\n\ |
6881 | 139 dimensionality as the other matrix.\n\ |
6869 | 140 \n\ |
141 @seealso{arrayfun, cellfun}\n\ | |
142 @end deftypefn") | |
143 { | |
144 int nargin = args.length (); | |
145 octave_value_list retval; | |
146 | |
147 if (nargin != 3) | |
148 print_usage (); | |
149 else | |
150 { | |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
151 octave_value func = args(0); |
6869 | 152 |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
153 if (func.is_string ()) |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
154 { |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
155 std::string name = func.string_value (); |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
156 func = symbol_table::find_function (name); |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
157 if (func.is_undefined ()) |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
158 error ("bsxfun: invalid function name: %s", name.c_str ()); |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
159 } |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
160 else if (! (args(0).is_function_handle () || args(0).is_inline_function ())) |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
161 error ("bsxfun: first argument must be a string or function handle"); |
6869 | 162 |
163 if (! error_state) | |
164 { | |
165 const octave_value A = args (1); | |
166 dim_vector dva = A.dims (); | |
167 octave_idx_type nda = dva.length (); | |
168 const octave_value B = args (2); | |
169 dim_vector dvb = B.dims (); | |
170 octave_idx_type ndb = dvb.length (); | |
171 octave_idx_type nd = nda; | |
172 | |
173 if (nda > ndb) | |
174 dvb.resize (nda, 1); | |
175 else if (nda < ndb) | |
176 { | |
177 dva.resize (ndb, 1); | |
178 nd = ndb; | |
179 } | |
180 | |
181 for (octave_idx_type i = 0; i < nd; i++) | |
182 if (dva (i) != dvb (i) && dva (i) != 1 && dvb (i) != 1) | |
183 { | |
184 error ("bsxfun: dimensions don't match"); | |
185 break; | |
186 } | |
187 | |
188 if (!error_state) | |
189 { | |
190 // Find the size of the output | |
191 dim_vector dvc; | |
192 dvc.resize (nd); | |
193 | |
194 for (octave_idx_type i = 0; i < nd; i++) | |
195 dvc (i) = (dva (i) < 1 ? dva (i) : (dvb (i) < 1 ? dvb (i) : | |
196 (dva (i) > dvb (i) ? dva (i) : dvb (i)))); | |
197 | |
198 if (dva == dvb || dva.numel () == 1 || dvb.numel () == 1) | |
199 { | |
200 octave_value_list inputs; | |
201 inputs (0) = A; | |
202 inputs (1) = B; | |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
203 retval = func.do_multi_index_op (1, inputs); |
6869 | 204 } |
205 else if (dvc.numel () < 1) | |
206 { | |
207 octave_value_list inputs; | |
208 inputs (0) = A.resize (dvc); | |
209 inputs (1) = B.resize (dvc); | |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
210 retval = func.do_multi_index_op (1, inputs); |
6869 | 211 } |
212 else | |
213 { | |
214 octave_idx_type ncount = 1; | |
215 for (octave_idx_type i = 1; i < nd; i++) | |
216 ncount *= dvc (i); | |
217 | |
218 #define BSXDEF(T) \ | |
219 T result_ ## T; \ | |
220 bool have_ ## T = false; | |
221 | |
222 BSXDEF(NDArray); | |
223 BSXDEF(ComplexNDArray); | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
224 BSXDEF(FloatNDArray); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
225 BSXDEF(FloatComplexNDArray); |
6869 | 226 BSXDEF(boolNDArray); |
227 BSXDEF(int8NDArray); | |
228 BSXDEF(int16NDArray); | |
229 BSXDEF(int32NDArray); | |
230 BSXDEF(int64NDArray); | |
231 BSXDEF(uint8NDArray); | |
232 BSXDEF(uint16NDArray); | |
233 BSXDEF(uint32NDArray); | |
234 BSXDEF(uint64NDArray); | |
235 | |
236 octave_value Ac ; | |
237 octave_value_list idxA; | |
238 octave_value Bc; | |
239 octave_value_list idxB; | |
240 octave_value C; | |
241 octave_value_list inputs; | |
242 Array<int> ra_idx (dvc.length(), 0); | |
243 | |
244 | |
245 for (octave_idx_type i = 0; i < ncount; i++) | |
246 { | |
247 if (maybe_update_column (Ac, A, dva, dvc, i, idxA)) | |
248 inputs (0) = Ac; | |
249 | |
250 if (maybe_update_column (Bc, B, dvb, dvc, i, idxB)) | |
251 inputs (1) = Bc; | |
252 | |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
253 octave_value_list tmp = func.do_multi_index_op (1, inputs); |
6869 | 254 |
255 if (error_state) | |
256 break; | |
257 | |
258 #define BSXINIT(T, CLS, EXTRACTOR) \ | |
259 (result_type == CLS) \ | |
260 { \ | |
261 have_ ## T = true; \ | |
262 result_ ## T = \ | |
263 tmp (0). EXTRACTOR ## _array_value (); \ | |
264 result_ ## T .resize (dvc); \ | |
265 } | |
266 | |
267 if (i == 0) | |
268 { | |
269 if (! tmp(0).is_sparse_type ()) | |
270 { | |
271 std::string result_type = tmp(0).class_name (); | |
272 if (result_type == "double") | |
273 { | |
274 if (tmp(0).is_real_type ()) | |
275 { | |
276 have_NDArray = true; | |
277 result_NDArray = tmp(0).array_value (); | |
278 result_NDArray.resize (dvc); | |
279 } | |
280 else | |
281 { | |
282 have_ComplexNDArray = true; | |
283 result_ComplexNDArray = | |
284 tmp(0).complex_array_value (); | |
285 result_ComplexNDArray.resize (dvc); | |
286 } | |
287 } | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
288 else if (result_type == "single") |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
289 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
290 if (tmp(0).is_real_type ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
291 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
292 have_FloatNDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
293 result_FloatNDArray = tmp(0).float_array_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
294 result_FloatNDArray.resize (dvc); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
295 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
296 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
297 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
298 have_ComplexNDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
299 result_ComplexNDArray = |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
300 tmp(0).complex_array_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
301 result_ComplexNDArray.resize (dvc); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
302 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
303 } |
6869 | 304 else if BSXINIT(boolNDArray, "logical", bool) |
305 else if BSXINIT(int8NDArray, "int8", int8) | |
306 else if BSXINIT(int16NDArray, "int16", int16) | |
307 else if BSXINIT(int32NDArray, "int32", int32) | |
308 else if BSXINIT(int64NDArray, "int64", int64) | |
309 else if BSXINIT(uint8NDArray, "uint8", uint8) | |
310 else if BSXINIT(uint16NDArray, "uint16", uint16) | |
311 else if BSXINIT(uint32NDArray, "uint32", uint32) | |
312 else if BSXINIT(uint64NDArray, "uint64", uint64) | |
313 else | |
314 { | |
315 C = tmp (0); | |
316 C = C.resize (dvc); | |
317 } | |
318 } | |
319 } | |
320 else | |
321 { | |
322 update_index (ra_idx, dvc, i); | |
323 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
324 if (have_FloatNDArray || |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
325 have_FloatComplexNDArray) |
6869 | 326 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
327 if (! tmp(0).is_float_type ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
328 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
329 if (have_FloatNDArray) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
330 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
331 have_FloatNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
332 C = result_FloatNDArray; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
333 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
334 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
335 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
336 have_FloatComplexNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
337 C = result_FloatComplexNDArray; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
338 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
339 C = do_cat_op (C, tmp(0), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
340 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
341 else if (tmp(0).is_double_type ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
342 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
343 if (tmp(0).is_complex_type () && |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
344 have_FloatNDArray) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
345 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
346 result_ComplexNDArray = |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
347 ComplexNDArray (result_FloatNDArray); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
348 result_ComplexNDArray.insert |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
349 (tmp(0).complex_array_value(), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
350 have_FloatComplexNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
351 have_ComplexNDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
352 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
353 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
354 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
355 result_NDArray = |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
356 NDArray (result_FloatNDArray); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
357 result_NDArray.insert |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
358 (tmp(0).array_value(), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
359 have_FloatNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
360 have_NDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
361 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
362 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
363 else if (tmp(0).is_real_type ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
364 result_FloatNDArray.insert |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
365 (tmp(0).float_array_value(), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
366 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
367 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
368 result_FloatComplexNDArray = |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
369 FloatComplexNDArray (result_FloatNDArray); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
370 result_FloatComplexNDArray.insert |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
371 (tmp(0).float_complex_array_value(), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
372 have_FloatNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
373 have_FloatComplexNDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
374 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
375 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
376 else if (have_NDArray) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
377 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
378 if (! tmp(0).is_float_type ()) |
6869 | 379 { |
380 have_NDArray = false; | |
381 C = result_NDArray; | |
382 C = do_cat_op (C, tmp(0), ra_idx); | |
383 } | |
384 else if (tmp(0).is_real_type ()) | |
385 result_NDArray.insert (tmp(0).array_value(), | |
386 ra_idx); | |
387 else | |
388 { | |
389 result_ComplexNDArray = | |
390 ComplexNDArray (result_NDArray); | |
391 result_ComplexNDArray.insert | |
392 (tmp(0).complex_array_value(), ra_idx); | |
393 have_NDArray = false; | |
394 have_ComplexNDArray = true; | |
395 } | |
396 } | |
397 | |
398 #define BSXLOOP(T, CLS, EXTRACTOR) \ | |
399 (have_ ## T) \ | |
400 { \ | |
401 if (tmp (0).class_name () != CLS) \ | |
402 { \ | |
403 have_ ## T = false; \ | |
404 C = result_ ## T; \ | |
405 C = do_cat_op (C, tmp (0), ra_idx); \ | |
406 } \ | |
407 else \ | |
408 result_ ## T .insert \ | |
409 (tmp(0). EXTRACTOR ## _array_value (), \ | |
410 ra_idx); \ | |
411 } | |
412 | |
413 else if BSXLOOP(ComplexNDArray, "double", complex) | |
414 else if BSXLOOP(boolNDArray, "logical", bool) | |
415 else if BSXLOOP(int8NDArray, "int8", int8) | |
416 else if BSXLOOP(int16NDArray, "int16", int16) | |
417 else if BSXLOOP(int32NDArray, "int32", int32) | |
418 else if BSXLOOP(int64NDArray, "int64", int64) | |
419 else if BSXLOOP(uint8NDArray, "uint8", uint8) | |
420 else if BSXLOOP(uint16NDArray, "uint16", uint16) | |
421 else if BSXLOOP(uint32NDArray, "uint32", uint32) | |
422 else if BSXLOOP(uint64NDArray, "uint64", uint64) | |
423 else | |
424 C = do_cat_op (C, tmp(0), ra_idx); | |
425 } | |
426 } | |
427 | |
428 #define BSXEND(T) \ | |
429 (have_ ## T) \ | |
430 retval (0) = result_ ## T; | |
431 | |
432 if BSXEND(NDArray) | |
433 else if BSXEND(ComplexNDArray) | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
434 else if BSXEND(FloatNDArray) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
435 else if BSXEND(FloatComplexNDArray) |
6869 | 436 else if BSXEND(boolNDArray) |
437 else if BSXEND(int8NDArray) | |
438 else if BSXEND(int16NDArray) | |
439 else if BSXEND(int32NDArray) | |
440 else if BSXEND(int64NDArray) | |
441 else if BSXEND(uint8NDArray) | |
442 else if BSXEND(uint16NDArray) | |
443 else if BSXEND(uint32NDArray) | |
444 else if BSXEND(uint64NDArray) | |
445 else | |
446 retval(0) = C; | |
447 } | |
448 } | |
449 } | |
450 } | |
451 | |
452 return retval; | |
453 } | |
454 | |
455 /* | |
456 | |
457 %!shared a, b, c, f | |
458 %! a = randn (4, 4); | |
459 %! b = mean (a, 1); | |
460 %! c = mean (a, 2); | |
461 %! f = @minus; | |
462 %!error(bsxfun (f)); | |
463 %!error(bsxfun (f, a)); | |
464 %!error(bsxfun (a, b)); | |
465 %!error(bsxfun (a, b, c)); | |
466 %!error(bsxfun (f, a, b, c)); | |
467 %!error(bsxfun (f, ones(4, 0), ones(4, 4))) | |
468 %!assert(bsxfun (f, ones(4, 0), ones(4, 1)), zeros(4, 0)); | |
469 %!assert(bsxfun (f, ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
470 %!assert(bsxfun (f, a, b), a - repmat(b, 4, 1)); | |
471 %!assert(bsxfun (f, a, c), a - repmat(c, 1, 4)); | |
472 %!assert(bsxfun ("minus", ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
473 | |
474 %!shared a, b, c, f | |
475 %! a = randn (4, 4); | |
476 %! a(1) *= 1i; | |
477 %! b = mean (a, 1); | |
478 %! c = mean (a, 2); | |
479 %! f = @minus; | |
480 %!error(bsxfun (f)); | |
481 %!error(bsxfun (f, a)); | |
482 %!error(bsxfun (a, b)); | |
483 %!error(bsxfun (a, b, c)); | |
484 %!error(bsxfun (f, a, b, c)); | |
485 %!error(bsxfun (f, ones(4, 0), ones(4, 4))) | |
486 %!assert(bsxfun (f, ones(4, 0), ones(4, 1)), zeros(4, 0)); | |
487 %!assert(bsxfun (f, ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
488 %!assert(bsxfun (f, a, b), a - repmat(b, 4, 1)); | |
489 %!assert(bsxfun (f, a, c), a - repmat(c, 1, 4)); | |
490 %!assert(bsxfun ("minus", ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
491 | |
492 %!shared a, b, c, f | |
493 %! a = randn (4, 4); | |
494 %! a(end) *= 1i; | |
495 %! b = mean (a, 1); | |
496 %! c = mean (a, 2); | |
497 %! f = @minus; | |
498 %!error(bsxfun (f)); | |
499 %!error(bsxfun (f, a)); | |
500 %!error(bsxfun (a, b)); | |
501 %!error(bsxfun (a, b, c)); | |
502 %!error(bsxfun (f, a, b, c)); | |
503 %!error(bsxfun (f, ones(4, 0), ones(4, 4))) | |
504 %!assert(bsxfun (f, ones(4, 0), ones(4, 1)), zeros(4, 0)); | |
505 %!assert(bsxfun (f, ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
506 %!assert(bsxfun (f, a, b), a - repmat(b, 4, 1)); | |
507 %!assert(bsxfun (f, a, c), a - repmat(c, 1, 4)); | |
508 %!assert(bsxfun ("minus", ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
509 | |
510 %!shared a, b, c, f | |
511 %! a = randn (4, 4); | |
512 %! b = a (1, :); | |
513 %! c = a (:, 1); | |
514 %! f = @(x, y) x == y; | |
515 %!error(bsxfun (f)); | |
516 %!error(bsxfun (f, a)); | |
517 %!error(bsxfun (a, b)); | |
518 %!error(bsxfun (a, b, c)); | |
519 %!error(bsxfun (f, a, b, c)); | |
520 %!error(bsxfun (f, ones(4, 0), ones(4, 4))) | |
521 %!assert(bsxfun (f, ones(4, 0), ones(4, 1)), zeros(4, 0, "logical")); | |
522 %!assert(bsxfun (f, ones(1, 4), ones(4, 1)), ones(4, 4, "logical")); | |
523 %!assert(bsxfun (f, a, b), a == repmat(b, 4, 1)); | |
524 %!assert(bsxfun (f, a, c), a == repmat(c, 1, 4)); | |
525 | |
526 %!shared a, b, c, d, f | |
527 %! a = randn (4, 4, 4); | |
528 %! b = mean (a, 1); | |
529 %! c = mean (a, 2); | |
530 %! d = mean (a, 3); | |
531 %! f = @minus; | |
532 %!error(bsxfun (f, ones([4, 0, 4]), ones([4, 4, 4]))); | |
533 %!assert(bsxfun (f, ones([4, 0, 4]), ones([4, 1, 4])), zeros([4, 0, 4])); | |
534 %!assert(bsxfun (f, ones([4, 4, 0]), ones([4, 1, 1])), zeros([4, 4, 0])); | |
535 %!assert(bsxfun (f, ones([1, 4, 4]), ones([4, 1, 4])), zeros([4, 4, 4])); | |
536 %!assert(bsxfun (f, ones([4, 4, 1]), ones([4, 1, 4])), zeros([4, 4, 4])); | |
537 %!assert(bsxfun (f, ones([4, 1, 4]), ones([1, 4, 4])), zeros([4, 4, 4])); | |
538 %!assert(bsxfun (f, ones([4, 1, 4]), ones([1, 4, 1])), zeros([4, 4, 4])); | |
539 %!assert(bsxfun (f, a, b), a - repmat(b, [4, 1, 1])); | |
540 %!assert(bsxfun (f, a, c), a - repmat(c, [1, 4, 1])); | |
541 %!assert(bsxfun (f, a, d), a - repmat(d, [1, 1, 4])); | |
542 %!assert(bsxfun ("minus", ones([4, 0, 4]), ones([4, 1, 4])), zeros([4, 0, 4])); | |
543 | |
544 %% The below is a very hard case to treat | |
545 %!assert(bsxfun (f, ones([4, 1, 4, 1]), ones([1, 4, 1, 4])), zeros([4, 4, 4, 4])); | |
546 | |
547 */ |