Mercurial > octave-nkf
annotate src/DLD-FUNCTIONS/bsxfun.cc @ 9783:119d97db51f0
avoid repeated table init in bsxfun
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Sun, 08 Nov 2009 21:14:23 +0100 |
parents | 26abff55f6fe |
children | c15a5ed0da58 |
rev | line source |
---|---|
6869 | 1 /* |
2 | |
8920 | 3 Copyright (C) 2007, 2008, 2009 David Bateman |
9783
119d97db51f0
avoid repeated table init in bsxfun
Jaroslav Hajek <highegg@gmail.com>
parents:
9743
diff
changeset
|
4 Copyright (C) 2009 VZLU Prague |
6869 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
6869 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
6869 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
28 #include <string> | |
29 #include <vector> | |
30 #include <list> | |
31 | |
32 #include "lo-mappers.h" | |
33 | |
34 #include "oct-map.h" | |
35 #include "defun-dld.h" | |
36 #include "parse.h" | |
37 #include "variables.h" | |
38 #include "ov-colon.h" | |
39 #include "unwind-prot.h" | |
9743
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
40 #include "ov-fcn-handle.h" |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
41 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
42 // Optimized bsxfun operations |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
43 enum bsxfun_builtin_op |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
44 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
45 bsxfun_builtin_plus = 0, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
46 bsxfun_builtin_minus, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
47 bsxfun_builtin_times, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
48 bsxfun_builtin_divide, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
49 bsxfun_builtin_max, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
50 bsxfun_builtin_min, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
51 bsxfun_builtin_eq, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
52 bsxfun_builtin_ne, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
53 bsxfun_builtin_lt, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
54 bsxfun_builtin_le, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
55 bsxfun_builtin_gt, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
56 bsxfun_builtin_ge, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
57 bsxfun_builtin_and, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
58 bsxfun_builtin_or, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
59 bsxfun_builtin_unknown, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
60 bsxfun_num_builtin_ops = bsxfun_builtin_unknown |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
61 }; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
62 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
63 const char *bsxfun_builtin_names[] = |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
64 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
65 "plus", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
66 "minus", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
67 "times", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
68 "rdivide", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
69 "max", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
70 "min", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
71 "eq", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
72 "ne", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
73 "lt", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
74 "le", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
75 "gt", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
76 "ge", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
77 "and", |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
78 "or" |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
79 }; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
80 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
81 static bsxfun_builtin_op |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
82 bsxfun_builtin_lookup (const std::string& name) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
83 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
84 for (int i = 0; i < bsxfun_num_builtin_ops; i++) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
85 if (name == bsxfun_builtin_names[i]) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
86 return static_cast<bsxfun_builtin_op> (i); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
87 return bsxfun_builtin_unknown; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
88 } |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
89 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
90 typedef octave_value (*bsxfun_handler) (const octave_value&, const octave_value&); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
91 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
92 // Static table of handlers. |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
93 bsxfun_handler bsxfun_handler_table[bsxfun_num_builtin_ops][btyp_num_types]; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
94 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
95 template <class NDA, NDA (bsxfun_op) (const NDA&, const NDA&)> |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
96 static octave_value |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
97 bsxfun_forward_op (const octave_value& x, const octave_value& y) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
98 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
99 NDA xa = octave_value_extract<NDA> (x); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
100 NDA ya = octave_value_extract<NDA> (y); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
101 return octave_value (bsxfun_op (xa, ya)); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
102 } |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
103 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
104 template <class NDA, boolNDArray (bsxfun_rel) (const NDA&, const NDA&)> |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
105 static octave_value |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
106 bsxfun_forward_rel (const octave_value& x, const octave_value& y) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
107 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
108 NDA xa = octave_value_extract<NDA> (x); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
109 NDA ya = octave_value_extract<NDA> (y); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
110 return octave_value (bsxfun_rel (xa, ya)); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
111 } |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
112 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
113 static void maybe_fill_table (void) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
114 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
115 static bool filled = false; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
116 if (filled) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
117 return; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
118 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
119 #define REGISTER_OP_HANDLER(OP, BTYP, NDA, FUNOP) \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
120 bsxfun_handler_table[OP][BTYP] = bsxfun_forward_op<NDA, FUNOP> |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
121 #define REGISTER_REL_HANDLER(REL, BTYP, NDA, FUNREL) \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
122 bsxfun_handler_table[REL][BTYP] = bsxfun_forward_rel<NDA, FUNREL> |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
123 #define REGISTER_STD_HANDLERS(BTYP, NDA) \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
124 REGISTER_OP_HANDLER (bsxfun_builtin_plus, BTYP, NDA, bsxfun_add); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
125 REGISTER_OP_HANDLER (bsxfun_builtin_minus, BTYP, NDA, bsxfun_sub); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
126 REGISTER_OP_HANDLER (bsxfun_builtin_times, BTYP, NDA, bsxfun_mul); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
127 REGISTER_OP_HANDLER (bsxfun_builtin_divide, BTYP, NDA, bsxfun_div); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
128 REGISTER_OP_HANDLER (bsxfun_builtin_max, BTYP, NDA, bsxfun_max); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
129 REGISTER_OP_HANDLER (bsxfun_builtin_min, BTYP, NDA, bsxfun_min); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
130 REGISTER_REL_HANDLER (bsxfun_builtin_eq, BTYP, NDA, bsxfun_eq); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
131 REGISTER_REL_HANDLER (bsxfun_builtin_ne, BTYP, NDA, bsxfun_ne); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
132 REGISTER_REL_HANDLER (bsxfun_builtin_lt, BTYP, NDA, bsxfun_lt); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
133 REGISTER_REL_HANDLER (bsxfun_builtin_le, BTYP, NDA, bsxfun_le); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
134 REGISTER_REL_HANDLER (bsxfun_builtin_gt, BTYP, NDA, bsxfun_gt); \ |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
135 REGISTER_REL_HANDLER (bsxfun_builtin_ge, BTYP, NDA, bsxfun_ge) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
136 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
137 REGISTER_STD_HANDLERS (btyp_double, NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
138 REGISTER_STD_HANDLERS (btyp_float, FloatNDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
139 REGISTER_STD_HANDLERS (btyp_complex, ComplexNDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
140 REGISTER_STD_HANDLERS (btyp_float_complex, FloatComplexNDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
141 REGISTER_STD_HANDLERS (btyp_int8, int8NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
142 REGISTER_STD_HANDLERS (btyp_int16, int16NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
143 REGISTER_STD_HANDLERS (btyp_int32, int32NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
144 REGISTER_STD_HANDLERS (btyp_int64, int64NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
145 REGISTER_STD_HANDLERS (btyp_uint8, uint8NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
146 REGISTER_STD_HANDLERS (btyp_uint16, uint16NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
147 REGISTER_STD_HANDLERS (btyp_uint32, uint32NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
148 REGISTER_STD_HANDLERS (btyp_uint64, uint64NDArray); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
149 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
150 // For bools, we register and/or. |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
151 REGISTER_OP_HANDLER (bsxfun_builtin_and, btyp_bool, boolNDArray, bsxfun_and); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
152 REGISTER_OP_HANDLER (bsxfun_builtin_or, btyp_bool, boolNDArray, bsxfun_or); |
9783
119d97db51f0
avoid repeated table init in bsxfun
Jaroslav Hajek <highegg@gmail.com>
parents:
9743
diff
changeset
|
153 |
119d97db51f0
avoid repeated table init in bsxfun
Jaroslav Hajek <highegg@gmail.com>
parents:
9743
diff
changeset
|
154 filled = true; |
9743
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
155 } |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
156 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
157 static octave_value |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
158 maybe_optimized_builtin (const std::string& name, |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
159 const octave_value& a, const octave_value& b) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
160 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
161 octave_value retval; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
162 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
163 maybe_fill_table (); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
164 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
165 bsxfun_builtin_op op = bsxfun_builtin_lookup (name); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
166 if (op != bsxfun_builtin_unknown) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
167 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
168 builtin_type_t btyp_a = a.builtin_type (), btyp_b = b.builtin_type (); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
169 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
170 // Simplify single/double combinations. |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
171 if (btyp_a == btyp_float && btyp_b == btyp_double) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
172 btyp_b = btyp_float; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
173 else if (btyp_a == btyp_double && btyp_b == btyp_float) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
174 btyp_a = btyp_float; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
175 else if (btyp_a == btyp_float_complex && btyp_b == btyp_complex) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
176 btyp_b = btyp_float_complex; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
177 else if (btyp_a == btyp_complex && btyp_b == btyp_float_complex) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
178 btyp_a = btyp_float_complex; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
179 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
180 if (btyp_a == btyp_b && btyp_a != btyp_unknown) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
181 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
182 bsxfun_handler handler = bsxfun_handler_table[op][btyp_a]; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
183 if (handler) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
184 retval = handler (a, b); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
185 } |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
186 } |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
187 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
188 return retval; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
189 } |
6869 | 190 |
191 static bool | |
192 maybe_update_column (octave_value& Ac, const octave_value& A, | |
193 const dim_vector& dva, const dim_vector& dvc, | |
194 octave_idx_type i, octave_value_list &idx) | |
195 { | |
196 octave_idx_type nd = dva.length (); | |
197 | |
198 if (i == 0) | |
199 { | |
200 idx(0) = octave_value (':'); | |
201 for (octave_idx_type j = 1; j < nd; j++) | |
202 { | |
203 if (dva (j) == 1) | |
204 idx (j) = octave_value (1); | |
205 else | |
206 idx (j) = octave_value ((i % dvc(j)) + 1); | |
207 | |
208 i = i / dvc (j); | |
209 } | |
210 | |
211 Ac = A; | |
212 Ac = Ac.single_subsref ("(", idx); | |
213 return true; | |
214 } | |
215 else | |
216 { | |
217 bool is_changed = false; | |
218 octave_idx_type k = i; | |
219 octave_idx_type k1 = i - 1; | |
220 for (octave_idx_type j = 1; j < nd; j++) | |
221 { | |
222 if (dva(j) != 1 && k % dvc (j) != k1 % dvc (j)) | |
223 { | |
224 idx (j) = octave_value ((k % dvc(j)) + 1); | |
225 is_changed = true; | |
226 } | |
227 | |
228 k = k / dvc (j); | |
229 k1 = k1 / dvc (j); | |
230 } | |
231 | |
232 if (is_changed) | |
233 { | |
234 Ac = A; | |
235 Ac = Ac.single_subsref ("(", idx); | |
236 return true; | |
237 } | |
238 else | |
239 return false; | |
240 } | |
241 } | |
242 | |
6959 | 243 #if 0 |
244 // FIXME -- this function is not used; is it OK to delete it? | |
6869 | 245 static void |
246 update_index (octave_value_list& idx, const dim_vector& dv, octave_idx_type i) | |
247 { | |
248 octave_idx_type nd = dv.length (); | |
249 | |
250 if (i == 0) | |
251 { | |
252 for (octave_idx_type j = nd - 1; j > 0; j--) | |
253 idx(j) = octave_value (static_cast<double>(1)); | |
254 idx(0) = octave_value (':'); | |
255 } | |
256 else | |
257 { | |
258 for (octave_idx_type j = 1; j < nd; j++) | |
259 { | |
260 idx (j) = octave_value (i % dv (j) + 1); | |
261 i = i / dv (j); | |
262 } | |
263 } | |
264 } | |
6959 | 265 #endif |
6869 | 266 |
267 static void | |
268 update_index (Array<int>& idx, const dim_vector& dv, octave_idx_type i) | |
269 { | |
270 octave_idx_type nd = dv.length (); | |
271 | |
272 idx(0) = 0; | |
273 for (octave_idx_type j = 1; j < nd; j++) | |
274 { | |
275 idx (j) = i % dv (j); | |
276 i = i / dv (j); | |
277 } | |
278 } | |
279 | |
6959 | 280 DEFUN_DLD (bsxfun, args, , |
8715 | 281 "-*- texinfo -*-\n\ |
7001 | 282 @deftypefn {Loadable Function} {} bsxfun (@var{f}, @var{a}, @var{b})\n\ |
6869 | 283 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
|
284 @var{a} and @var{b}. The function @var{f} must be capable of accepting\n\ |
6869 | 285 two column vector arguments of equal length, or one column vector\n\ |
286 argument and a scalar.\n\ | |
287 \n\ | |
9041
853f96e8008f
Cleanup documentation file matrix.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
288 The dimensions of @var{a} and @var{b} must be equal or singleton. The\n\ |
7001 | 289 singleton dimensions of the matrices will be expanded to the same\n\ |
6881 | 290 dimensionality as the other matrix.\n\ |
6869 | 291 \n\ |
292 @seealso{arrayfun, cellfun}\n\ | |
293 @end deftypefn") | |
294 { | |
295 int nargin = args.length (); | |
296 octave_value_list retval; | |
297 | |
298 if (nargin != 3) | |
299 print_usage (); | |
300 else | |
301 { | |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
302 octave_value func = args(0); |
6869 | 303 |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
304 if (func.is_string ()) |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
305 { |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
306 std::string name = func.string_value (); |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
307 func = symbol_table::find_function (name); |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
308 if (func.is_undefined ()) |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
309 error ("bsxfun: invalid function name: %s", name.c_str ()); |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
310 } |
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
311 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
|
312 error ("bsxfun: first argument must be a string or function handle"); |
6869 | 313 |
9743
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
314 const octave_value A = args (1); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
315 const octave_value B = args (2); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
316 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
317 if (func.is_builtin_function () |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
318 || (func.is_function_handle () |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
319 && ! func.fcn_handle_value ()->is_overloaded () |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
320 && ! A.is_object () && ! B.is_object ())) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
321 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
322 octave_function *fcn_val = func.function_value (); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
323 if (fcn_val) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
324 { |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
325 octave_value tmp = maybe_optimized_builtin (fcn_val->name (), A, B); |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
326 if (tmp.is_defined ()) |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
327 retval(0) = tmp; |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
328 } |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
329 } |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
330 |
26abff55f6fe
optimize bsxfun for common built-in operations
Jaroslav Hajek <highegg@gmail.com>
parents:
9450
diff
changeset
|
331 if (! error_state && retval.empty ()) |
6869 | 332 { |
333 dim_vector dva = A.dims (); | |
334 octave_idx_type nda = dva.length (); | |
335 dim_vector dvb = B.dims (); | |
336 octave_idx_type ndb = dvb.length (); | |
337 octave_idx_type nd = nda; | |
338 | |
339 if (nda > ndb) | |
340 dvb.resize (nda, 1); | |
341 else if (nda < ndb) | |
342 { | |
343 dva.resize (ndb, 1); | |
344 nd = ndb; | |
345 } | |
346 | |
347 for (octave_idx_type i = 0; i < nd; i++) | |
348 if (dva (i) != dvb (i) && dva (i) != 1 && dvb (i) != 1) | |
349 { | |
350 error ("bsxfun: dimensions don't match"); | |
351 break; | |
352 } | |
353 | |
354 if (!error_state) | |
355 { | |
356 // Find the size of the output | |
357 dim_vector dvc; | |
358 dvc.resize (nd); | |
359 | |
360 for (octave_idx_type i = 0; i < nd; i++) | |
361 dvc (i) = (dva (i) < 1 ? dva (i) : (dvb (i) < 1 ? dvb (i) : | |
362 (dva (i) > dvb (i) ? dva (i) : dvb (i)))); | |
363 | |
364 if (dva == dvb || dva.numel () == 1 || dvb.numel () == 1) | |
365 { | |
366 octave_value_list inputs; | |
367 inputs (0) = A; | |
368 inputs (1) = B; | |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
369 retval = func.do_multi_index_op (1, inputs); |
6869 | 370 } |
371 else if (dvc.numel () < 1) | |
372 { | |
373 octave_value_list inputs; | |
374 inputs (0) = A.resize (dvc); | |
375 inputs (1) = B.resize (dvc); | |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
376 retval = func.do_multi_index_op (1, inputs); |
6869 | 377 } |
378 else | |
379 { | |
380 octave_idx_type ncount = 1; | |
381 for (octave_idx_type i = 1; i < nd; i++) | |
382 ncount *= dvc (i); | |
383 | |
384 #define BSXDEF(T) \ | |
385 T result_ ## T; \ | |
386 bool have_ ## T = false; | |
387 | |
388 BSXDEF(NDArray); | |
389 BSXDEF(ComplexNDArray); | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
390 BSXDEF(FloatNDArray); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
391 BSXDEF(FloatComplexNDArray); |
6869 | 392 BSXDEF(boolNDArray); |
393 BSXDEF(int8NDArray); | |
394 BSXDEF(int16NDArray); | |
395 BSXDEF(int32NDArray); | |
396 BSXDEF(int64NDArray); | |
397 BSXDEF(uint8NDArray); | |
398 BSXDEF(uint16NDArray); | |
399 BSXDEF(uint32NDArray); | |
400 BSXDEF(uint64NDArray); | |
401 | |
402 octave_value Ac ; | |
403 octave_value_list idxA; | |
404 octave_value Bc; | |
405 octave_value_list idxB; | |
406 octave_value C; | |
407 octave_value_list inputs; | |
408 Array<int> ra_idx (dvc.length(), 0); | |
409 | |
410 | |
411 for (octave_idx_type i = 0; i < ncount; i++) | |
412 { | |
413 if (maybe_update_column (Ac, A, dva, dvc, i, idxA)) | |
414 inputs (0) = Ac; | |
415 | |
416 if (maybe_update_column (Bc, B, dvb, dvc, i, idxB)) | |
417 inputs (1) = Bc; | |
418 | |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
9041
diff
changeset
|
419 octave_value_list tmp = func.do_multi_index_op (1, inputs); |
6869 | 420 |
421 if (error_state) | |
422 break; | |
423 | |
424 #define BSXINIT(T, CLS, EXTRACTOR) \ | |
425 (result_type == CLS) \ | |
426 { \ | |
427 have_ ## T = true; \ | |
428 result_ ## T = \ | |
429 tmp (0). EXTRACTOR ## _array_value (); \ | |
430 result_ ## T .resize (dvc); \ | |
431 } | |
432 | |
433 if (i == 0) | |
434 { | |
435 if (! tmp(0).is_sparse_type ()) | |
436 { | |
437 std::string result_type = tmp(0).class_name (); | |
438 if (result_type == "double") | |
439 { | |
440 if (tmp(0).is_real_type ()) | |
441 { | |
442 have_NDArray = true; | |
443 result_NDArray = tmp(0).array_value (); | |
444 result_NDArray.resize (dvc); | |
445 } | |
446 else | |
447 { | |
448 have_ComplexNDArray = true; | |
449 result_ComplexNDArray = | |
450 tmp(0).complex_array_value (); | |
451 result_ComplexNDArray.resize (dvc); | |
452 } | |
453 } | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
454 else if (result_type == "single") |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
455 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
456 if (tmp(0).is_real_type ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
457 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
458 have_FloatNDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
459 result_FloatNDArray = tmp(0).float_array_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
460 result_FloatNDArray.resize (dvc); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
461 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
462 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
463 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
464 have_ComplexNDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
465 result_ComplexNDArray = |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
466 tmp(0).complex_array_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
467 result_ComplexNDArray.resize (dvc); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
468 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
469 } |
6869 | 470 else if BSXINIT(boolNDArray, "logical", bool) |
471 else if BSXINIT(int8NDArray, "int8", int8) | |
472 else if BSXINIT(int16NDArray, "int16", int16) | |
473 else if BSXINIT(int32NDArray, "int32", int32) | |
474 else if BSXINIT(int64NDArray, "int64", int64) | |
475 else if BSXINIT(uint8NDArray, "uint8", uint8) | |
476 else if BSXINIT(uint16NDArray, "uint16", uint16) | |
477 else if BSXINIT(uint32NDArray, "uint32", uint32) | |
478 else if BSXINIT(uint64NDArray, "uint64", uint64) | |
479 else | |
480 { | |
481 C = tmp (0); | |
482 C = C.resize (dvc); | |
483 } | |
484 } | |
485 } | |
486 else | |
487 { | |
488 update_index (ra_idx, dvc, i); | |
489 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
490 if (have_FloatNDArray || |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
491 have_FloatComplexNDArray) |
6869 | 492 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
493 if (! tmp(0).is_float_type ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
494 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
495 if (have_FloatNDArray) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
496 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
497 have_FloatNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
498 C = result_FloatNDArray; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
499 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
500 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
501 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
502 have_FloatComplexNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
503 C = result_FloatComplexNDArray; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
504 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
505 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
|
506 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
507 else if (tmp(0).is_double_type ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
508 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
509 if (tmp(0).is_complex_type () && |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
510 have_FloatNDArray) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
511 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
512 result_ComplexNDArray = |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
513 ComplexNDArray (result_FloatNDArray); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
514 result_ComplexNDArray.insert |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
515 (tmp(0).complex_array_value(), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
516 have_FloatComplexNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
517 have_ComplexNDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
518 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
519 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
520 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
521 result_NDArray = |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
522 NDArray (result_FloatNDArray); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
523 result_NDArray.insert |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
524 (tmp(0).array_value(), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
525 have_FloatNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
526 have_NDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
527 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
528 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
529 else if (tmp(0).is_real_type ()) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
530 result_FloatNDArray.insert |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
531 (tmp(0).float_array_value(), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
532 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
533 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
534 result_FloatComplexNDArray = |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
535 FloatComplexNDArray (result_FloatNDArray); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
536 result_FloatComplexNDArray.insert |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
537 (tmp(0).float_complex_array_value(), ra_idx); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
538 have_FloatNDArray = false; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
539 have_FloatComplexNDArray = true; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
540 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
541 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
542 else if (have_NDArray) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
543 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
544 if (! tmp(0).is_float_type ()) |
6869 | 545 { |
546 have_NDArray = false; | |
547 C = result_NDArray; | |
548 C = do_cat_op (C, tmp(0), ra_idx); | |
549 } | |
550 else if (tmp(0).is_real_type ()) | |
551 result_NDArray.insert (tmp(0).array_value(), | |
552 ra_idx); | |
553 else | |
554 { | |
555 result_ComplexNDArray = | |
556 ComplexNDArray (result_NDArray); | |
557 result_ComplexNDArray.insert | |
558 (tmp(0).complex_array_value(), ra_idx); | |
559 have_NDArray = false; | |
560 have_ComplexNDArray = true; | |
561 } | |
562 } | |
563 | |
564 #define BSXLOOP(T, CLS, EXTRACTOR) \ | |
565 (have_ ## T) \ | |
566 { \ | |
567 if (tmp (0).class_name () != CLS) \ | |
568 { \ | |
569 have_ ## T = false; \ | |
570 C = result_ ## T; \ | |
571 C = do_cat_op (C, tmp (0), ra_idx); \ | |
572 } \ | |
573 else \ | |
574 result_ ## T .insert \ | |
575 (tmp(0). EXTRACTOR ## _array_value (), \ | |
576 ra_idx); \ | |
577 } | |
578 | |
579 else if BSXLOOP(ComplexNDArray, "double", complex) | |
580 else if BSXLOOP(boolNDArray, "logical", bool) | |
581 else if BSXLOOP(int8NDArray, "int8", int8) | |
582 else if BSXLOOP(int16NDArray, "int16", int16) | |
583 else if BSXLOOP(int32NDArray, "int32", int32) | |
584 else if BSXLOOP(int64NDArray, "int64", int64) | |
585 else if BSXLOOP(uint8NDArray, "uint8", uint8) | |
586 else if BSXLOOP(uint16NDArray, "uint16", uint16) | |
587 else if BSXLOOP(uint32NDArray, "uint32", uint32) | |
588 else if BSXLOOP(uint64NDArray, "uint64", uint64) | |
589 else | |
590 C = do_cat_op (C, tmp(0), ra_idx); | |
591 } | |
592 } | |
593 | |
594 #define BSXEND(T) \ | |
595 (have_ ## T) \ | |
596 retval (0) = result_ ## T; | |
597 | |
598 if BSXEND(NDArray) | |
599 else if BSXEND(ComplexNDArray) | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
600 else if BSXEND(FloatNDArray) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7016
diff
changeset
|
601 else if BSXEND(FloatComplexNDArray) |
6869 | 602 else if BSXEND(boolNDArray) |
603 else if BSXEND(int8NDArray) | |
604 else if BSXEND(int16NDArray) | |
605 else if BSXEND(int32NDArray) | |
606 else if BSXEND(int64NDArray) | |
607 else if BSXEND(uint8NDArray) | |
608 else if BSXEND(uint16NDArray) | |
609 else if BSXEND(uint32NDArray) | |
610 else if BSXEND(uint64NDArray) | |
611 else | |
612 retval(0) = C; | |
613 } | |
614 } | |
615 } | |
616 } | |
617 | |
618 return retval; | |
619 } | |
620 | |
621 /* | |
622 | |
623 %!shared a, b, c, f | |
624 %! a = randn (4, 4); | |
625 %! b = mean (a, 1); | |
626 %! c = mean (a, 2); | |
627 %! f = @minus; | |
628 %!error(bsxfun (f)); | |
629 %!error(bsxfun (f, a)); | |
630 %!error(bsxfun (a, b)); | |
631 %!error(bsxfun (a, b, c)); | |
632 %!error(bsxfun (f, a, b, c)); | |
633 %!error(bsxfun (f, ones(4, 0), ones(4, 4))) | |
634 %!assert(bsxfun (f, ones(4, 0), ones(4, 1)), zeros(4, 0)); | |
635 %!assert(bsxfun (f, ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
636 %!assert(bsxfun (f, a, b), a - repmat(b, 4, 1)); | |
637 %!assert(bsxfun (f, a, c), a - repmat(c, 1, 4)); | |
638 %!assert(bsxfun ("minus", ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
639 | |
640 %!shared a, b, c, f | |
641 %! a = randn (4, 4); | |
642 %! a(1) *= 1i; | |
643 %! b = mean (a, 1); | |
644 %! c = mean (a, 2); | |
645 %! f = @minus; | |
646 %!error(bsxfun (f)); | |
647 %!error(bsxfun (f, a)); | |
648 %!error(bsxfun (a, b)); | |
649 %!error(bsxfun (a, b, c)); | |
650 %!error(bsxfun (f, a, b, c)); | |
651 %!error(bsxfun (f, ones(4, 0), ones(4, 4))) | |
652 %!assert(bsxfun (f, ones(4, 0), ones(4, 1)), zeros(4, 0)); | |
653 %!assert(bsxfun (f, ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
654 %!assert(bsxfun (f, a, b), a - repmat(b, 4, 1)); | |
655 %!assert(bsxfun (f, a, c), a - repmat(c, 1, 4)); | |
656 %!assert(bsxfun ("minus", ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
657 | |
658 %!shared a, b, c, f | |
659 %! a = randn (4, 4); | |
660 %! a(end) *= 1i; | |
661 %! b = mean (a, 1); | |
662 %! c = mean (a, 2); | |
663 %! f = @minus; | |
664 %!error(bsxfun (f)); | |
665 %!error(bsxfun (f, a)); | |
666 %!error(bsxfun (a, b)); | |
667 %!error(bsxfun (a, b, c)); | |
668 %!error(bsxfun (f, a, b, c)); | |
669 %!error(bsxfun (f, ones(4, 0), ones(4, 4))) | |
670 %!assert(bsxfun (f, ones(4, 0), ones(4, 1)), zeros(4, 0)); | |
671 %!assert(bsxfun (f, ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
672 %!assert(bsxfun (f, a, b), a - repmat(b, 4, 1)); | |
673 %!assert(bsxfun (f, a, c), a - repmat(c, 1, 4)); | |
674 %!assert(bsxfun ("minus", ones(1, 4), ones(4, 1)), zeros(4, 4)); | |
675 | |
676 %!shared a, b, c, f | |
677 %! a = randn (4, 4); | |
678 %! b = a (1, :); | |
679 %! c = a (:, 1); | |
680 %! f = @(x, y) x == y; | |
681 %!error(bsxfun (f)); | |
682 %!error(bsxfun (f, a)); | |
683 %!error(bsxfun (a, b)); | |
684 %!error(bsxfun (a, b, c)); | |
685 %!error(bsxfun (f, a, b, c)); | |
686 %!error(bsxfun (f, ones(4, 0), ones(4, 4))) | |
687 %!assert(bsxfun (f, ones(4, 0), ones(4, 1)), zeros(4, 0, "logical")); | |
688 %!assert(bsxfun (f, ones(1, 4), ones(4, 1)), ones(4, 4, "logical")); | |
689 %!assert(bsxfun (f, a, b), a == repmat(b, 4, 1)); | |
690 %!assert(bsxfun (f, a, c), a == repmat(c, 1, 4)); | |
691 | |
692 %!shared a, b, c, d, f | |
693 %! a = randn (4, 4, 4); | |
694 %! b = mean (a, 1); | |
695 %! c = mean (a, 2); | |
696 %! d = mean (a, 3); | |
697 %! f = @minus; | |
698 %!error(bsxfun (f, ones([4, 0, 4]), ones([4, 4, 4]))); | |
699 %!assert(bsxfun (f, ones([4, 0, 4]), ones([4, 1, 4])), zeros([4, 0, 4])); | |
700 %!assert(bsxfun (f, ones([4, 4, 0]), ones([4, 1, 1])), zeros([4, 4, 0])); | |
701 %!assert(bsxfun (f, ones([1, 4, 4]), ones([4, 1, 4])), zeros([4, 4, 4])); | |
702 %!assert(bsxfun (f, ones([4, 4, 1]), ones([4, 1, 4])), zeros([4, 4, 4])); | |
703 %!assert(bsxfun (f, ones([4, 1, 4]), ones([1, 4, 4])), zeros([4, 4, 4])); | |
704 %!assert(bsxfun (f, ones([4, 1, 4]), ones([1, 4, 1])), zeros([4, 4, 4])); | |
705 %!assert(bsxfun (f, a, b), a - repmat(b, [4, 1, 1])); | |
706 %!assert(bsxfun (f, a, c), a - repmat(c, [1, 4, 1])); | |
707 %!assert(bsxfun (f, a, d), a - repmat(d, [1, 1, 4])); | |
708 %!assert(bsxfun ("minus", ones([4, 0, 4]), ones([4, 1, 4])), zeros([4, 0, 4])); | |
709 | |
710 %% The below is a very hard case to treat | |
711 %!assert(bsxfun (f, ones([4, 1, 4, 1]), ones([1, 4, 1, 4])), zeros([4, 4, 4, 4])); | |
712 | |
713 */ |