GNU Octave
4.4.1
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
op-int.h
Go to the documentation of this file.
1
/*
2
3
Copyright (C) 1996-2018 John W. Eaton
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
9
the Free Software Foundation, either version 3 of the License, or
10
(at your option) any later version.
11
12
Octave is distributed in the hope that it will be useful, but
13
WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
16
17
You should have received a copy of the GNU General Public License
18
along with Octave; see the file COPYING. If not, see
19
<https://www.gnu.org/licenses/>.
20
21
*/
22
23
#if ! defined (octave_op_int_h)
24
#define octave_op_int_h 1
25
26
#include "octave-config.h"
27
28
#include "
quit.h
"
29
#include "
bsxfun.h
"
30
31
#define DEFINTBINOP_OP(name, t1, t2, op, t3) \
32
static octave_value \
33
CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
34
const octave_base_value& a2) \
35
{ \
36
const octave_ ## t1& v1 = dynamic_cast<const octave_ ## t1&> (a1); \
37
const octave_ ## t2& v2 = dynamic_cast<const octave_ ## t2&> (a2); \
38
octave_value retval = octave_value \
39
(v1.t1 ## _value () op v2.t2 ## _value ()); \
40
return retval; \
41
}
42
43
#define DEFINTNDBINOP_OP(name, t1, t2, e1, e2, op, t3) \
44
static octave_value \
45
CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
46
const octave_base_value& a2) \
47
{ \
48
const octave_ ## t1& v1 = dynamic_cast<const octave_ ## t1&> (a1); \
49
const octave_ ## t2& v2 = dynamic_cast<const octave_ ## t2&> (a2); \
50
octave_value retval = octave_value \
51
(v1.e1 ## _value () op v2.e2 ## _value ()); \
52
return retval; \
53
}
54
55
#define DEFINTBINOP_FN(name, t1, t2, f, t3, op) \
56
static octave_value \
57
CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
58
const octave_base_value& a2) \
59
{ \
60
const octave_ ## t1& v1 = dynamic_cast<const octave_ ## t1&> (a1); \
61
const octave_ ## t2& v2 = dynamic_cast<const octave_ ## t2&> (a2); \
62
octave_value retval = octave_value (f (v1.t1 ## _value (), v2.t2 ## _value ())); \
63
return retval; \
64
}
65
66
#define DEFINTNDBINOP_FN(name, t1, t2, e1, e2, f, t3, op) \
67
static octave_value \
68
CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
69
const octave_base_value& a2) \
70
{ \
71
const octave_ ## t1& v1 = dynamic_cast<const octave_ ## t1&> (a1); \
72
const octave_ ## t2& v2 = dynamic_cast<const octave_ ## t2&> (a2); \
73
octave_value retval = octave_value (f (v1.e1 ## _value (), v2.e2 ## _value ())); \
74
return retval; \
75
}
76
77
#define OCTAVE_CONCAT_FN2(T1, T2) \
78
DEFNDCATOP_FN2 (T1 ## _ ## T2 ## _s_s, T1 ## _scalar, T2 ## _scalar, , T1 ## NDArray, T1 ## _array, T2 ## _array, concat) \
79
DEFNDCATOP_FN2 (T1 ## _ ## T2 ## _s_m, T1 ## _scalar, T2 ## _matrix, , T1 ## NDArray, T1 ## _array, T2 ## _array, concat) \
80
DEFNDCATOP_FN2 (T1 ## _ ## T2 ## _m_s, T1 ## _matrix, T2 ## _scalar, , T1 ## NDArray, T1 ## _array, T2 ## _array, concat) \
81
DEFNDCATOP_FN2 (T1 ## _ ## T2 ## _m_m, T1 ## _matrix, T2 ## _matrix, , T1 ## NDArray, T1 ## _array, T2 ## _array, concat)
82
83
#define OCTAVE_INSTALL_CONCAT_FN2(T1, T2) \
84
INSTALL_CATOP_TI (ti, octave_ ## T1 ## _scalar, octave_ ## T2 ## _scalar, T1 ## _ ## T2 ## _s_s) \
85
INSTALL_CATOP_TI (ti, octave_ ## T1 ## _scalar, octave_ ## T2 ## _matrix, T1 ## _ ## T2 ## _s_m) \
86
INSTALL_CATOP_TI (ti, octave_ ## T1 ## _matrix, octave_ ## T2 ## _scalar, T1 ## _ ## T2 ## _m_s) \
87
INSTALL_CATOP_TI (ti, octave_ ## T1 ## _matrix, octave_ ## T2 ## _matrix, T1 ## _ ## T2 ## _m_m)
88
89
#define OCTAVE_DOUBLE_INT_CONCAT_FN(TYPE) \
90
DEFNDCATOP_FN2 (double ## _ ## TYPE ## _s_s, scalar, TYPE ## _scalar, TYPE ## NDArray, , array, TYPE ## _array, concat) \
91
DEFNDCATOP_FN2 (double ## _ ## TYPE ## _s_m, scalar, TYPE ## _matrix, TYPE ## NDArray, , array, TYPE ## _array, concat) \
92
DEFNDCATOP_FN2 (double ## _ ## TYPE ## _m_s, matrix, TYPE ## _scalar, TYPE ## NDArray, , array, TYPE ## _array, concat) \
93
DEFNDCATOP_FN2 (double ## _ ## TYPE ## _m_m, matrix, TYPE ## _matrix, TYPE ## NDArray, , array, TYPE ## _array, concat)
94
95
#define OCTAVE_INSTALL_DOUBLE_INT_CONCAT_FN(TYPE) \
96
INSTALL_CATOP_TI (ti, octave_scalar, octave_ ## TYPE ## _scalar, double ## _ ## TYPE ## _s_s) \
97
INSTALL_CATOP_TI (ti, octave_scalar, octave_ ## TYPE ## _matrix, double ## _ ## TYPE ## _s_m) \
98
INSTALL_CATOP_TI (ti, octave_matrix, octave_ ## TYPE ## _scalar, double ## _ ## TYPE ## _m_s) \
99
INSTALL_CATOP_TI (ti, octave_matrix, octave_ ## TYPE ## _matrix, double ## _ ## TYPE ## _m_m)
100
101
#define OCTAVE_INT_DOUBLE_CONCAT_FN(TYPE) \
102
DEFNDCATOP_FN2 (TYPE ## _ ## double ## _s_s, TYPE ## _scalar, scalar, , TYPE ## NDArray, TYPE ## _array, array, concat) \
103
DEFNDCATOP_FN2 (TYPE ## _ ## double ## _s_m, TYPE ## _scalar, matrix, , TYPE ## NDArray, TYPE ## _array, array, concat) \
104
DEFNDCATOP_FN2 (TYPE ## _ ## double ## _m_s, TYPE ## _matrix, scalar, , TYPE ## NDArray, TYPE ## _array, array, concat) \
105
DEFNDCATOP_FN2 (TYPE ## _ ## double ## _m_m, TYPE ## _matrix, matrix, , TYPE ## NDArray, TYPE ## _array, array, concat)
106
107
#define OCTAVE_INSTALL_INT_DOUBLE_CONCAT_FN(TYPE) \
108
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _scalar, octave_scalar, TYPE ## _ ## double ## _s_s) \
109
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _scalar, octave_matrix, TYPE ## _ ## double ## _s_m) \
110
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _matrix, octave_scalar, TYPE ## _ ## double ## _m_s) \
111
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _matrix, octave_matrix, TYPE ## _ ## double ## _m_m)
112
113
#define OCTAVE_FLOAT_INT_CONCAT_FN(TYPE) \
114
DEFNDCATOP_FN2 (float ## _ ## TYPE ## _s_s, float_scalar, TYPE ## _scalar, TYPE ## NDArray, , float_array, TYPE ## _array, concat) \
115
DEFNDCATOP_FN2 (float ## _ ## TYPE ## _s_m, float_scalar, TYPE ## _matrix, TYPE ## NDArray, , float_array, TYPE ## _array, concat) \
116
DEFNDCATOP_FN2 (float ## _ ## TYPE ## _m_s, float_matrix, TYPE ## _scalar, TYPE ## NDArray, , float_array, TYPE ## _array, concat) \
117
DEFNDCATOP_FN2 (float ## _ ## TYPE ## _m_m, float_matrix, TYPE ## _matrix, TYPE ## NDArray, , float_array, TYPE ## _array, concat)
118
119
#define OCTAVE_INSTALL_FLOAT_INT_CONCAT_FN(TYPE) \
120
INSTALL_CATOP_TI (ti, octave_float_scalar, octave_ ## TYPE ## _scalar, float ## _ ## TYPE ## _s_s) \
121
INSTALL_CATOP_TI (ti, octave_float_scalar, octave_ ## TYPE ## _matrix, float ## _ ## TYPE ## _s_m) \
122
INSTALL_CATOP_TI (ti, octave_float_matrix, octave_ ## TYPE ## _scalar, float ## _ ## TYPE ## _m_s) \
123
INSTALL_CATOP_TI (ti, octave_float_matrix, octave_ ## TYPE ## _matrix, float ## _ ## TYPE ## _m_m)
124
125
#define OCTAVE_INT_FLOAT_CONCAT_FN(TYPE) \
126
DEFNDCATOP_FN2 (TYPE ## _ ## float ## _s_s, TYPE ## _scalar, float_scalar, , TYPE ## NDArray, TYPE ## _array, float_array, concat) \
127
DEFNDCATOP_FN2 (TYPE ## _ ## float ## _s_m, TYPE ## _scalar, float_matrix, , TYPE ## NDArray, TYPE ## _array, float_array, concat) \
128
DEFNDCATOP_FN2 (TYPE ## _ ## float ## _m_s, TYPE ## _matrix, float_scalar, , TYPE ## NDArray, TYPE ## _array, float_array, concat) \
129
DEFNDCATOP_FN2 (TYPE ## _ ## float ## _m_m, TYPE ## _matrix, float_matrix, , TYPE ## NDArray, TYPE ## _array, float_array, concat)
130
131
#define OCTAVE_INSTALL_INT_FLOAT_CONCAT_FN(TYPE) \
132
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _scalar, octave_float_scalar, TYPE ## _ ## float ## _s_s) \
133
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _scalar, octave_float_matrix, TYPE ## _ ## float ## _s_m) \
134
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _matrix, octave_float_scalar, TYPE ## _ ## float ## _m_s) \
135
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _matrix, octave_float_matrix, TYPE ## _ ## float ## _m_m)
136
137
// For compatibility, concatenation with a character always returns a
138
// character.
139
140
#define OCTAVE_CHAR_INT_CONCAT_FN(TYPE) \
141
DEFNDCHARCATOP_FN (char ## _ ## TYPE ## _m_s, char_matrix, TYPE ## _scalar, concat) \
142
DEFNDCHARCATOP_FN (char ## _ ## TYPE ## _m_m, char_matrix, TYPE ## _matrix, concat)
143
144
#define OCTAVE_INSTALL_CHAR_INT_CONCAT_FN(TYPE) \
145
INSTALL_CATOP_TI (ti, octave_char_matrix_str, octave_ ## TYPE ## _scalar, char ## _ ## TYPE ## _m_s) \
146
INSTALL_CATOP_TI (ti, octave_char_matrix_str, octave_ ## TYPE ## _matrix, char ## _ ## TYPE ## _m_m) \
147
INSTALL_CATOP_TI (ti, octave_char_matrix_sq_str, octave_ ## TYPE ## _scalar, char ## _ ## TYPE ## _m_s) \
148
INSTALL_CATOP_TI (ti, octave_char_matrix_sq_str, octave_ ## TYPE ## _matrix, char ## _ ## TYPE ## _m_m)
149
150
#define OCTAVE_INT_CHAR_CONCAT_FN(TYPE) \
151
DEFNDCHARCATOP_FN (TYPE ## _ ## char ## _s_m, TYPE ## _scalar, char_matrix, concat) \
152
DEFNDCHARCATOP_FN (TYPE ## _ ## char ## _m_m, TYPE ## _matrix, char_matrix, concat)
153
154
#define OCTAVE_INSTALL_INT_CHAR_CONCAT_FN(TYPE) \
155
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _scalar, octave_char_matrix_str, TYPE ## _ ## char ## _s_m) \
156
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _matrix, octave_char_matrix_str, TYPE ## _ ## char ## _m_m) \
157
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _scalar, octave_char_matrix_sq_str, TYPE ## _ ## char ## _s_m) \
158
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _matrix, octave_char_matrix_sq_str, TYPE ## _ ## char ## _m_m)
159
160
#define OCTAVE_CONCAT_FN(TYPE) \
161
DEFNDCATOP_FN (TYPE ## _s_s, TYPE ## _scalar, TYPE ## _scalar, TYPE ## _array, TYPE ## _array, concat) \
162
DEFNDCATOP_FN (TYPE ## _s_m, TYPE ## _scalar, TYPE ## _matrix, TYPE ## _array, TYPE ## _array, concat) \
163
DEFNDCATOP_FN (TYPE ## _m_s, TYPE ## _matrix, TYPE ## _scalar, TYPE ## _array, TYPE ## _array, concat) \
164
DEFNDCATOP_FN (TYPE ## _m_m, TYPE ## _matrix, TYPE ## _matrix, TYPE ## _array, TYPE ## _array, concat)
165
166
#define OCTAVE_INSTALL_CONCAT_FN(TYPE) \
167
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _scalar, octave_ ## TYPE ## _scalar, TYPE ## _s_s) \
168
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _scalar, octave_ ## TYPE ## _matrix, TYPE ## _s_m) \
169
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _matrix, octave_ ## TYPE ## _scalar, TYPE ## _m_s) \
170
INSTALL_CATOP_TI (ti, octave_ ## TYPE ## _matrix, octave_ ## TYPE ## _matrix, TYPE ## _m_m)
171
172
// scalar unary ops.
173
#define OCTAVE_S_INT_UNOPS(TYPE) \
174
\
175
DEFUNOP_OP (s_not, TYPE ## _scalar, !) \
176
DEFUNOP_OP (s_uplus, TYPE ## _scalar,
/* no-op */
) \
177
DEFUNOP (s_uminus, TYPE ## _scalar) \
178
{ \
179
const octave_ ## TYPE ## _scalar & v = dynamic_cast<const octave_ ## TYPE ## _scalar &> (a); \
180
octave_value retval = octave_value (- v. TYPE ## _scalar_value ()); \
181
return retval; \
182
} \
183
DEFUNOP_OP (s_transpose, TYPE ## _scalar,
/* no-op */
) \
184
DEFUNOP_OP (s_hermitian, TYPE ## _scalar,
/* no-op */
) \
185
\
186
DEFNCUNOP_METHOD (s_incr, TYPE ## _scalar, increment) \
187
DEFNCUNOP_METHOD (s_decr, TYPE ## _scalar, decrement)
188
189
// scalar by scalar ops.
190
#define OCTAVE_SS_INT_ARITH_OPS(PFX, T1, T2, T3) \
191
\
192
DEFINTBINOP_OP (PFX ## _add, T1 ## scalar, T2 ## scalar, +, T3) \
193
DEFINTBINOP_OP (PFX ## _sub, T1 ## scalar, T2 ## scalar, -, T3) \
194
DEFINTBINOP_OP (PFX ## _mul, T1 ## scalar, T2 ## scalar, *, T3) \
195
\
196
DEFBINOP (PFX ## _div, T1 ## scalar, T2 ## scalar) \
197
{ \
198
const octave_ ## T1 ## scalar& v1 = dynamic_cast<const octave_ ## T1 ## scalar&> (a1); \
199
const octave_ ## T2 ## scalar& v2 = dynamic_cast<const octave_ ## T2 ## scalar&> (a2); \
200
\
201
if (! v2.T2 ## scalar_value ()) \
202
warn_divide_by_zero (); \
203
\
204
octave_value retval = octave_value (v1.T1 ## scalar_value () / v2.T2 ## scalar_value ()); \
205
return retval; \
206
} \
207
\
208
DEFINTBINOP_FN (PFX ## _pow, T1 ## scalar, T2 ## scalar, xpow, T3, ^) \
209
\
210
DEFBINOP (PFX ## _ldiv, T1 ## scalar, T2 ## scalar) \
211
{ \
212
const octave_ ## T1 ## scalar& v1 = dynamic_cast<const octave_ ## T1 ## scalar&> (a1); \
213
const octave_ ## T2 ## scalar& v2 = dynamic_cast<const octave_ ## T2 ## scalar&> (a2); \
214
\
215
if (! v1.T1 ## scalar_value ()) \
216
warn_divide_by_zero (); \
217
\
218
octave_value retval = octave_value (v2.T2 ## scalar_value () / v1.T1 ## scalar_value ()); \
219
return retval; \
220
} \
221
\
222
DEFINTBINOP_OP (PFX ## _el_mul, T1 ## scalar, T2 ## scalar, *, T3) \
223
\
224
DEFBINOP (PFX ## _el_div, T1 ## scalar, T2 ## scalar) \
225
{ \
226
const octave_ ## T1 ## scalar& v1 = dynamic_cast<const octave_ ## T1 ## scalar&> (a1); \
227
const octave_ ## T2 ## scalar& v2 = dynamic_cast<const octave_ ## T2 ## scalar&> (a2); \
228
\
229
if (! v2.T2 ## scalar_value ()) \
230
warn_divide_by_zero (); \
231
\
232
octave_value retval = octave_value (v1.T1 ## scalar_value () / v2.T2 ## scalar_value ()); \
233
return retval; \
234
} \
235
\
236
DEFINTBINOP_FN (PFX ## _el_pow, T1 ## scalar, T2 ## scalar, xpow, T3, .^) \
237
\
238
DEFBINOP (PFX ## _el_ldiv, T1 ## scalar, T2 ## scalar) \
239
{ \
240
const octave_ ## T1 ## scalar& v1 = dynamic_cast<const octave_ ## T1 ## scalar&> (a1); \
241
const octave_ ## T2 ## scalar& v2 = dynamic_cast<const octave_ ## T2 ## scalar&> (a2); \
242
\
243
if (! v1.T1 ## scalar_value ()) \
244
warn_divide_by_zero (); \
245
\
246
octave_value retval = octave_value (v2.T2 ## scalar_value () / v1.T1 ## scalar_value ()); \
247
return retval; \
248
}
249
250
#define OCTAVE_SS_INT_BOOL_OPS(PFX, T1, T2, Z1, Z2) \
251
DEFBINOP (PFX ## _el_and, T2, T2) \
252
{ \
253
const octave_ ## T1 ## scalar& v1 = dynamic_cast<const octave_ ## T1 ## scalar&> (a1); \
254
const octave_ ## T2 ## scalar& v2 = dynamic_cast<const octave_ ## T2 ## scalar&> (a2); \
255
\
256
return v1.T1 ## scalar_value () != Z1 && v2.T2 ## scalar_value () != Z2; \
257
} \
258
\
259
DEFBINOP (PFX ## _el_or, T1, T2) \
260
{ \
261
const octave_ ## T1 ## scalar& v1 = dynamic_cast<const octave_ ## T1 ## scalar&> (a1); \
262
const octave_ ## T2 ## scalar& v2 = dynamic_cast<const octave_ ## T2 ## scalar&> (a2); \
263
\
264
return v1.T1 ## scalar_value () != Z1 || v2.T2 ## scalar_value () != Z2; \
265
}
266
267
#define OCTAVE_SS_INT_CMP_OPS(PFX, T1, T2) \
268
DEFBINOP_OP (PFX ## _lt, T1 ## scalar, T2 ## scalar, <) \
269
DEFBINOP_OP (PFX ## _le, T1 ## scalar, T2 ## scalar, <=) \
270
DEFBINOP_OP (PFX ## _eq, T1 ## scalar, T2 ## scalar, ==) \
271
DEFBINOP_OP (PFX ## _ge, T1 ## scalar, T2 ## scalar, >=) \
272
DEFBINOP_OP (PFX ## _gt, T1 ## scalar, T2 ## scalar, >) \
273
DEFBINOP_OP (PFX ## _ne, T1 ## scalar, T2 ## scalar, !=)
274
275
#define OCTAVE_SS_POW_OPS(T1, T2) \
276
octave_value \
277
xpow (const octave_ ## T1& a, const octave_ ## T2& b) \
278
{ \
279
return pow (a, b); \
280
} \
281
\
282
octave_value \
283
xpow (const octave_ ## T1& a, double b) \
284
{ \
285
return pow (a, b); \
286
} \
287
\
288
octave_value \
289
xpow (double a, const octave_ ## T1& b) \
290
{ \
291
return pow (a, b); \
292
} \
293
\
294
octave_value \
295
xpow (const octave_ ## T1& a, float b) \
296
{ \
297
return powf (a, b); \
298
} \
299
\
300
octave_value \
301
xpow (float a, const octave_ ## T1& b) \
302
{ \
303
return powf (a, b); \
304
}
305
306
#define OCTAVE_SS_INT_OPS(TYPE) \
307
OCTAVE_S_INT_UNOPS (TYPE) \
308
OCTAVE_SS_POW_OPS (TYPE, TYPE) \
309
OCTAVE_SS_INT_ARITH_OPS (ss, TYPE ## _, TYPE ## _, TYPE) \
310
OCTAVE_SS_INT_ARITH_OPS (ssx, TYPE ## _, , TYPE) \
311
OCTAVE_SS_INT_ARITH_OPS (sxs, , TYPE ## _, TYPE) \
312
OCTAVE_SS_INT_ARITH_OPS (ssfx, TYPE ## _, float_, TYPE) \
313
OCTAVE_SS_INT_ARITH_OPS (sfxs, float_, TYPE ## _, TYPE) \
314
OCTAVE_SS_INT_CMP_OPS (ss, TYPE ## _, TYPE ## _) \
315
OCTAVE_SS_INT_CMP_OPS (sx, TYPE ## _, ) \
316
OCTAVE_SS_INT_CMP_OPS (xs, , TYPE ## _) \
317
OCTAVE_SS_INT_CMP_OPS (sfx, TYPE ## _, float_) \
318
OCTAVE_SS_INT_CMP_OPS (fxs, float_, TYPE ## _) \
319
OCTAVE_SS_INT_BOOL_OPS (ss, TYPE ## _, TYPE ## _, octave_ ## TYPE (0), octave_ ## TYPE (0)) \
320
OCTAVE_SS_INT_BOOL_OPS (sx, TYPE ## _, , octave_ ## TYPE (0), 0) \
321
OCTAVE_SS_INT_BOOL_OPS (xs, , TYPE ## _, 0, octave_ ## TYPE (0)) \
322
OCTAVE_SS_INT_BOOL_OPS (sfx, TYPE ## _, float_, octave_ ## TYPE (0), 0) \
323
OCTAVE_SS_INT_BOOL_OPS (fxs, float_, TYPE ## _, 0, octave_ ## TYPE (0))
324
325
// scalar by matrix ops.
326
#define OCTAVE_SM_INT_ARITH_OPS(PFX, TS, TM, TI) \
327
\
328
DEFINTNDBINOP_OP (PFX ## _add, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, +, TI) \
329
DEFINTNDBINOP_OP (PFX ## _sub, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, -, TI) \
330
DEFINTNDBINOP_OP (PFX ## _mul, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, *, TI) \
331
\
332
/* DEFBINOP (PFX ## _div, TS ## scalar, TM ## matrix) */
\
333
/* { */
\
334
/* const octave_ ## TS ## scalar& v1 = dynamic_cast<const octave_ ## TS ## scalar&> (a1); */
\
335
/* const octave_ ## TM ## matrix& v2 = dynamic_cast<const octave_ ## TM ## matrix&> (a2); */
\
336
/* */
\
337
/* Matrix m1 = v1.TM ## matrix_value (); */
\
338
/* Matrix m2 = v2.TM ## matrix_value (); */
\
339
/* */
\
340
/* return octave_value (xdiv (m1, m2)); */
\
341
/* } */
\
342
\
343
/* DEFBINOP_FN (PFX ## _pow, TS ## scalar, TM ## matrix, xpow) */
\
344
\
345
DEFBINOP (PFX ## _ldiv, TS ## scalar, TM ## matrix) \
346
{ \
347
const octave_ ## TS ## scalar& v1 = dynamic_cast<const octave_ ## TS ## scalar&> (a1); \
348
const octave_ ## TM ## matrix& v2 = dynamic_cast<const octave_ ## TM ## matrix&> (a2); \
349
\
350
if (! v1.TS ## scalar_value ()) \
351
warn_divide_by_zero (); \
352
\
353
octave_value retval = octave_value (v2.TM ## array_value () / v1.TS ## scalar_value ()); \
354
return retval; \
355
} \
356
\
357
DEFINTNDBINOP_OP (PFX ## _el_mul, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, *, TI) \
358
DEFBINOP (PFX ## _el_div, TS ## scalar, TM ## matrix) \
359
{ \
360
const octave_ ## TS ## scalar& v1 = dynamic_cast<const octave_ ## TS ## scalar&> (a1); \
361
const octave_ ## TM ## matrix& v2 = dynamic_cast<const octave_ ## TM ## matrix&> (a2); \
362
\
363
octave_value retval = octave_value (v1.TS ## scalar_value () / v2.TM ## array_value ()); \
364
return retval; \
365
} \
366
\
367
DEFINTNDBINOP_FN (PFX ## _el_pow, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, elem_xpow, TI, .^) \
368
\
369
DEFBINOP (PFX ## _el_ldiv, TS ## scalar, TM ## matrix) \
370
{ \
371
const octave_ ## TS ## scalar& v1 = dynamic_cast<const octave_ ## TS ## scalar&> (a1); \
372
const octave_ ## TM ## matrix& v2 = dynamic_cast<const octave_ ## TM ## matrix&> (a2); \
373
\
374
if (! v1.TS ## scalar_value ()) \
375
warn_divide_by_zero (); \
376
\
377
octave_value retval = octave_value (v2.TM ## array_value () / v1.TS ## scalar_value ()); \
378
return retval; \
379
}
380
381
#define OCTAVE_SM_INT_CMP_OPS(PFX, TS, TM) \
382
DEFNDBINOP_FN (PFX ## _lt, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_lt) \
383
DEFNDBINOP_FN (PFX ## _le, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_le) \
384
DEFNDBINOP_FN (PFX ## _eq, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_eq) \
385
DEFNDBINOP_FN (PFX ## _ge, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_ge) \
386
DEFNDBINOP_FN (PFX ## _gt, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_gt) \
387
DEFNDBINOP_FN (PFX ## _ne, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_ne)
388
389
#define OCTAVE_SM_INT_BOOL_OPS(PFX, TS, TM) \
390
DEFNDBINOP_FN (PFX ## _el_and, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_and) \
391
DEFNDBINOP_FN (PFX ## _el_or, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_or) \
392
DEFNDBINOP_FN (PFX ## _el_and_not, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_and_not) \
393
DEFNDBINOP_FN (PFX ## _el_or_not, TS ## scalar, TM ## matrix, TS ## scalar, TM ## array, mx_el_or_not)
394
395
#define OCTAVE_SM_POW_OPS(T1, T2) \
396
octave_value \
397
elem_xpow (const octave_ ## T1& a, const T2 ## NDArray& b) \
398
{ \
399
T2 ## NDArray result (b.dims ()); \
400
for (int i = 0; i < b.numel (); i++) \
401
{ \
402
octave_quit (); \
403
result (i) = pow (a, b(i)); \
404
} \
405
return octave_value (result); \
406
} \
407
\
408
octave_value \
409
elem_xpow (const octave_ ## T1& a, const NDArray& b) \
410
{ \
411
T1 ## NDArray result (b.dims ()); \
412
for (int i = 0; i < b.numel (); i++) \
413
{ \
414
octave_quit (); \
415
result (i) = pow (a, b(i)); \
416
} \
417
return octave_value (result); \
418
} \
419
\
420
octave_value \
421
elem_xpow (double a, const T2 ## NDArray& b) \
422
{ \
423
T2 ## NDArray result (b.dims ()); \
424
for (int i = 0; i < b.numel (); i++) \
425
{ \
426
octave_quit (); \
427
result (i) = pow (a, b(i)); \
428
} \
429
return octave_value (result); \
430
} \
431
\
432
octave_value \
433
elem_xpow (const octave_ ## T1& a, const FloatNDArray& b) \
434
{ \
435
T1 ## NDArray result (b.dims ()); \
436
for (int i = 0; i < b.numel (); i++) \
437
{ \
438
octave_quit (); \
439
result (i) = powf (a, b(i)); \
440
} \
441
return octave_value (result); \
442
} \
443
\
444
octave_value \
445
elem_xpow (float a, const T2 ## NDArray& b) \
446
{ \
447
T2 ## NDArray result (b.dims ()); \
448
for (int i = 0; i < b.numel (); i++) \
449
{ \
450
octave_quit (); \
451
result (i) = powf (a, b(i)); \
452
} \
453
return octave_value (result); \
454
}
455
456
#define OCTAVE_SM_CONV(TS, TM) \
457
DEFCONV (TS ## s_ ## TM ## m_conv, TM ## scalar, TM ## matrix) \
458
{ \
459
const octave_ ## TS ## scalar& v = dynamic_cast<const octave_ ## TS ## scalar&> (a); \
460
\
461
return new octave_ ## TM ## matrix (v.TM ## array_value ()); \
462
}
463
464
#define OCTAVE_SM_INT_OPS(TYPE) \
465
OCTAVE_SM_POW_OPS (TYPE, TYPE) \
466
OCTAVE_SM_INT_ARITH_OPS (sm, TYPE ## _, TYPE ## _, TYPE) \
467
OCTAVE_SM_INT_ARITH_OPS (smx, TYPE ## _, , TYPE) \
468
OCTAVE_SM_INT_ARITH_OPS (sxm, , TYPE ## _, TYPE) \
469
OCTAVE_SM_INT_ARITH_OPS (smfx, TYPE ## _, float_, TYPE) \
470
OCTAVE_SM_INT_ARITH_OPS (sfxm, float_, TYPE ## _, TYPE) \
471
OCTAVE_SM_INT_CMP_OPS (sm, TYPE ## _, TYPE ## _) \
472
OCTAVE_SM_INT_CMP_OPS (xm, , TYPE ## _) \
473
OCTAVE_SM_INT_CMP_OPS (smx, TYPE ## _, ) \
474
OCTAVE_SM_INT_CMP_OPS (fxm, float_, TYPE ## _) \
475
OCTAVE_SM_INT_CMP_OPS (smfx, TYPE ## _, float_) \
476
OCTAVE_SM_INT_BOOL_OPS (sm, TYPE ## _, TYPE ## _) \
477
OCTAVE_SM_INT_BOOL_OPS (xm, , TYPE ## _) \
478
OCTAVE_SM_INT_BOOL_OPS (smx, TYPE ## _, ) \
479
OCTAVE_SM_INT_BOOL_OPS (fxm, float_, TYPE ## _) \
480
OCTAVE_SM_INT_BOOL_OPS (smfx, TYPE ## _, float_) \
481
OCTAVE_SM_CONV (TYPE ## _, TYPE ## _) \
482
OCTAVE_SM_CONV (TYPE ## _, complex_) \
483
OCTAVE_SM_CONV (TYPE ## _, float_complex_)
484
485
// matrix by scalar ops.
486
#define OCTAVE_MS_INT_ARITH_OPS(PFX, TM, TS, TI) \
487
\
488
DEFINTNDBINOP_OP (PFX ## _add, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, +, TI) \
489
DEFINTNDBINOP_OP (PFX ## _sub, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, -, TI) \
490
DEFINTNDBINOP_OP (PFX ## _mul, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, *, TI) \
491
\
492
DEFBINOP (PFX ## _div, TM ## matrix, TS ## scalar) \
493
{ \
494
const octave_ ## TM ## matrix& v1 = dynamic_cast<const octave_ ## TM ## matrix&> (a1); \
495
const octave_ ## TS ## scalar& v2 = dynamic_cast<const octave_ ## TS ## scalar&> (a2); \
496
\
497
if (! v2.TS ## scalar_value ()) \
498
warn_divide_by_zero (); \
499
\
500
octave_value retval = octave_value (v1.TM ## array_value () / v2.TS ## scalar_value ()); \
501
return retval; \
502
} \
503
\
504
/* DEFBINOP_FN (PFX ## _pow, TM ## matrix, TS ## scalar, xpow) */
\
505
\
506
/* DEFBINOP (PFX ## _ldiv, TM ## matrix, TS ## scalar) */
\
507
/* { */
\
508
/* const octave_ ## TM ## matrix& v1 = dynamic_cast<const octave_ ## TM ## matrix&> (a1); */
\
509
/* const octave_ ## TS ## scalar& v2 = dynamic_cast<const octave_ ## TS ## scalar&> (a2); */
\
510
/* */
\
511
/* Matrix m1 = v1.TM ## matrix_value (); */
\
512
/* Matrix m2 = v2.TM ## matrix_value (); */
\
513
/* */
\
514
/* return octave_value (xleftdiv (m1, m2)); */
\
515
/* } */
\
516
\
517
DEFINTNDBINOP_OP (PFX ## _el_mul, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, *, TI) \
518
\
519
DEFBINOP (PFX ## _el_div, TM ## matrix, TS ## scalar) \
520
{ \
521
const octave_ ## TM ## matrix& v1 = dynamic_cast<const octave_ ## TM ## matrix&> (a1); \
522
const octave_ ## TS ## scalar& v2 = dynamic_cast<const octave_ ## TS ## scalar&> (a2); \
523
\
524
if (! v2.TS ## scalar_value ()) \
525
warn_divide_by_zero (); \
526
\
527
octave_value retval = octave_value (v1.TM ## array_value () / v2.TS ## scalar_value ()); \
528
return retval; \
529
} \
530
\
531
DEFINTNDBINOP_FN (PFX ## _el_pow, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, elem_xpow, TI, .^) \
532
\
533
DEFBINOP (PFX ## _el_ldiv, TM ## matrix, TS ## scalar) \
534
{ \
535
const octave_ ## TM ## matrix& v1 = dynamic_cast<const octave_ ## TM ## matrix&> (a1); \
536
const octave_ ## TS ## scalar& v2 = dynamic_cast<const octave_ ## TS ## scalar&> (a2); \
537
\
538
octave_value retval = v2.TS ## scalar_value () / v1.TM ## array_value (); \
539
return retval; \
540
}
541
542
#define OCTAVE_MS_INT_CMP_OPS(PFX, TM, TS) \
543
DEFNDBINOP_FN (PFX ## _lt, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_lt) \
544
DEFNDBINOP_FN (PFX ## _le, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_le) \
545
DEFNDBINOP_FN (PFX ## _eq, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_eq) \
546
DEFNDBINOP_FN (PFX ## _ge, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_ge) \
547
DEFNDBINOP_FN (PFX ## _gt, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_gt) \
548
DEFNDBINOP_FN (PFX ## _ne, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_ne)
549
550
#define OCTAVE_MS_INT_BOOL_OPS(PFX, TM, TS) \
551
DEFNDBINOP_FN (PFX ## _el_and, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_and) \
552
DEFNDBINOP_FN (PFX ## _el_or, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_or) \
553
DEFNDBINOP_FN (PFX ## _el_not_and, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_not_and) \
554
DEFNDBINOP_FN (PFX ## _el_not_or, TM ## matrix, TS ## scalar, TM ## array, TS ## scalar, mx_el_not_or)
555
556
#define OCTAVE_MS_INT_ASSIGN_OPS(PFX, TM, TS, TE) \
557
DEFNDASSIGNOP_FN (PFX ## _assign, TM ## matrix, TS ## scalar, TM ## scalar, assign)
558
559
#define OCTAVE_MS_INT_ASSIGNEQ_OPS(PFX, TM) \
560
DEFNDASSIGNOP_OP (PFX ## _assign_add, TM ## matrix, TM ## scalar, TM ## scalar, +=) \
561
DEFNDASSIGNOP_OP (PFX ## _assign_sub, TM ## matrix, TM ## scalar, TM ## scalar, -=) \
562
DEFNDASSIGNOP_OP (PFX ## _assign_mul, TM ## matrix, TM ## scalar, TM ## scalar, *=) \
563
DEFNDASSIGNOP_OP (PFX ## _assign_div, TM ## matrix, TM ## scalar, TM ## scalar, /=)
564
565
#define OCTAVE_MS_POW_OPS(T1, T2) \
566
octave_value elem_xpow (T1 ## NDArray a, octave_ ## T2 b) \
567
{ \
568
T1 ## NDArray result (a.dims ()); \
569
for (int i = 0; i < a.numel (); i++) \
570
{ \
571
octave_quit (); \
572
result (i) = pow (a(i), b); \
573
} \
574
return octave_value (result); \
575
} \
576
\
577
octave_value elem_xpow (T1 ## NDArray a, double b) \
578
{ \
579
T1 ## NDArray result (a.dims ()); \
580
for (int i = 0; i < a.numel (); i++) \
581
{ \
582
octave_quit (); \
583
result (i) = pow (a(i), b); \
584
} \
585
return octave_value (result); \
586
} \
587
\
588
octave_value elem_xpow (NDArray a, octave_ ## T2 b) \
589
{ \
590
T2 ## NDArray result (a.dims ()); \
591
for (int i = 0; i < a.numel (); i++) \
592
{ \
593
octave_quit (); \
594
result (i) = pow (a(i), b); \
595
} \
596
return octave_value (result); \
597
} \
598
\
599
octave_value elem_xpow (T1 ## NDArray a, float b) \
600
{ \
601
T1 ## NDArray result (a.dims ()); \
602
for (int i = 0; i < a.numel (); i++) \
603
{ \
604
octave_quit (); \
605
result (i) = powf (a(i), b); \
606
} \
607
return octave_value (result); \
608
} \
609
\
610
octave_value elem_xpow (FloatNDArray a, octave_ ## T2 b) \
611
{ \
612
T2 ## NDArray result (a.dims ()); \
613
for (int i = 0; i < a.numel (); i++) \
614
{ \
615
octave_quit (); \
616
result (i) = powf (a(i), b); \
617
} \
618
return octave_value (result); \
619
}
620
621
#define OCTAVE_MS_INT_OPS(TYPE) \
622
OCTAVE_MS_POW_OPS (TYPE, TYPE) \
623
OCTAVE_MS_INT_ARITH_OPS (ms, TYPE ## _, TYPE ## _, TYPE) \
624
OCTAVE_MS_INT_ARITH_OPS (msx, TYPE ## _, , TYPE) \
625
OCTAVE_MS_INT_ARITH_OPS (mxs, , TYPE ## _, TYPE) \
626
OCTAVE_MS_INT_ARITH_OPS (msfx, TYPE ## _, float_, TYPE) \
627
OCTAVE_MS_INT_ARITH_OPS (mfxs, float_, TYPE ## _, TYPE) \
628
OCTAVE_MS_INT_CMP_OPS (ms, TYPE ## _, TYPE ## _) \
629
OCTAVE_MS_INT_CMP_OPS (mx, TYPE ## _, ) \
630
OCTAVE_MS_INT_CMP_OPS (mxs, , TYPE ## _) \
631
OCTAVE_MS_INT_CMP_OPS (mfx, TYPE ## _, float_) \
632
OCTAVE_MS_INT_CMP_OPS (mfxs, float_, TYPE ## _) \
633
OCTAVE_MS_INT_BOOL_OPS (ms, TYPE ## _, TYPE ## _) \
634
OCTAVE_MS_INT_BOOL_OPS (mx, TYPE ## _, ) \
635
OCTAVE_MS_INT_BOOL_OPS (mxs, , TYPE ## _) \
636
OCTAVE_MS_INT_BOOL_OPS (mfx, TYPE ## _, float_) \
637
OCTAVE_MS_INT_BOOL_OPS (mfxs, float_, TYPE ## _) \
638
OCTAVE_MS_INT_ASSIGN_OPS (ms, TYPE ## _, TYPE ## _, TYPE ## _) \
639
OCTAVE_MS_INT_ASSIGNEQ_OPS (mse, TYPE ## _) \
640
OCTAVE_MS_INT_ASSIGN_OPS (mx, TYPE ## _, , ) \
641
OCTAVE_MS_INT_ASSIGN_OPS (mfx, TYPE ## _, float_, float_)
642
643
// matrix unary ops.
644
#define OCTAVE_M_INT_UNOPS(TYPE) \
645
\
646
DEFNDUNOP_OP (m_not, TYPE ## _matrix, TYPE ## _array, !) \
647
DEFNDUNOP_OP (m_uplus, TYPE ## _matrix, TYPE ## _array,
/* no-op */
) \
648
DEFUNOP (m_uminus, TYPE ## _matrix) \
649
{ \
650
const octave_ ## TYPE ## _matrix & v = dynamic_cast<const octave_ ## TYPE ## _matrix &> (a); \
651
octave_value retval = octave_value (- v. TYPE ## _array_value ()); \
652
return retval; \
653
} \
654
\
655
DEFUNOP (m_transpose, TYPE ## _matrix) \
656
{ \
657
const octave_ ## TYPE ## _matrix& v = dynamic_cast<const octave_ ## TYPE ## _matrix&> (a); \
658
\
659
if (v.ndims () > 2) \
660
error ("transpose not defined for N-D objects"); \
661
\
662
return octave_value (v.TYPE ## _array_value ().transpose ()); \
663
} \
664
\
665
DEFNCUNOP_METHOD (m_incr, TYPE ## _matrix, increment) \
666
DEFNCUNOP_METHOD (m_decr, TYPE ## _matrix, decrement) \
667
DEFNCUNOP_METHOD (m_changesign, TYPE ## _matrix, changesign)
668
669
// matrix by matrix ops.
670
#define OCTAVE_MM_INT_ARITH_OPS(PFX, T1, T2, T3) \
671
\
672
DEFINTNDBINOP_OP (PFX ## _add, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, +, T3) \
673
DEFINTNDBINOP_OP (PFX ## _sub, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, -, T3) \
674
\
675
/* DEFBINOP_OP (PFX ## _mul, T1 ## matrix, T2 ## matrix, *) */
\
676
/* DEFBINOP_FN (PFX ## _div, T1 ## matrix, T2 ## matrix, xdiv) */
\
677
\
678
DEFBINOPX (PFX ## _pow, T1 ## matrix, T2 ## matrix) \
679
{ \
680
error ("can't do A ^ B for A and B both matrices"); \
681
} \
682
\
683
/* DEFBINOP_FN (PFX ## _ldiv, T1 ## matrix, T2 ## matrix, xleftdiv) */
\
684
\
685
DEFINTNDBINOP_FN (PFX ## _el_mul, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, product, T3, .*) \
686
\
687
DEFINTNDBINOP_FN (PFX ## _el_div, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, quotient, T3, ./) \
688
\
689
DEFINTNDBINOP_FN (PFX ## _el_pow, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, elem_xpow, T3, .^) \
690
\
691
DEFBINOP (PFX ## _el_ldiv, T1 ## matrix, T2 ## matrix) \
692
{ \
693
const octave_ ## T1 ## matrix& v1 = dynamic_cast<const octave_ ## T1 ## matrix&> (a1); \
694
const octave_ ## T2 ## matrix& v2 = dynamic_cast<const octave_ ## T2 ## matrix&> (a2); \
695
\
696
octave_value retval = octave_value (quotient (v2.T2 ## array_value (), v1.T1 ## array_value ())); \
697
return retval; \
698
}
699
700
#define OCTAVE_MM_INT_CMP_OPS(PFX, T1, T2) \
701
DEFNDBINOP_FN (PFX ## _lt, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_lt) \
702
DEFNDBINOP_FN (PFX ## _le, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_le) \
703
DEFNDBINOP_FN (PFX ## _eq, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_eq) \
704
DEFNDBINOP_FN (PFX ## _ge, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_ge) \
705
DEFNDBINOP_FN (PFX ## _gt, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_gt) \
706
DEFNDBINOP_FN (PFX ## _ne, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_ne)
707
708
#define OCTAVE_MM_INT_BOOL_OPS(PFX, T1, T2) \
709
DEFNDBINOP_FN (PFX ## _el_and, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_and) \
710
DEFNDBINOP_FN (PFX ## _el_or, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_or) \
711
DEFNDBINOP_FN (PFX ## _el_not_and, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_not_and) \
712
DEFNDBINOP_FN (PFX ## _el_not_or, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_not_or) \
713
DEFNDBINOP_FN (PFX ## _el_and_not, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_and_not) \
714
DEFNDBINOP_FN (PFX ## _el_or_not, T1 ## matrix, T2 ## matrix, T1 ## array, T2 ## array, mx_el_or_not)
715
716
#define OCTAVE_MM_INT_ASSIGN_OPS(PFX, TLHS, TRHS, TE) \
717
DEFNDASSIGNOP_FN (PFX ## _assign, TLHS ## matrix, TRHS ## matrix, TLHS ## array, assign)
718
719
#define OCTAVE_MM_INT_ASSIGNEQ_OPS(PFX, TM) \
720
DEFNDASSIGNOP_OP (PFX ## _assign_add, TM ## matrix, TM ## matrix, TM ## array, +=) \
721
DEFNDASSIGNOP_OP (PFX ## _assign_sub, TM ## matrix, TM ## matrix, TM ## array, -=) \
722
DEFNDASSIGNOP_FNOP (PFX ## _assign_el_mul, TM ## matrix, TM ## matrix, TM ## array, product_eq) \
723
DEFNDASSIGNOP_FNOP (PFX ## _assign_el_div, TM ## matrix, TM ## matrix, TM ## array, quotient_eq)
724
725
#define OCTAVE_MM_POW_OPS(T1, T2) \
726
octave_value \
727
elem_xpow (const T1 ## NDArray& a, const T2 ## NDArray& b) \
728
{ \
729
dim_vector a_dims = a.dims (); \
730
dim_vector b_dims = b.dims (); \
731
if (a_dims != b_dims) \
732
{ \
733
if (! is_valid_bsxfun ("operator .^", a_dims, b_dims)) \
734
octave::err_nonconformant ("operator .^", a_dims, b_dims); \
735
\
736
return bsxfun_pow (a, b); \
737
} \
738
T1 ## NDArray result (a_dims); \
739
for (int i = 0; i < a.numel (); i++) \
740
{ \
741
octave_quit (); \
742
result (i) = pow (a(i), b(i)); \
743
} \
744
return octave_value (result); \
745
} \
746
\
747
octave_value \
748
elem_xpow (const T1 ## NDArray& a, const NDArray& b) \
749
{ \
750
dim_vector a_dims = a.dims (); \
751
dim_vector b_dims = b.dims (); \
752
if (a_dims != b_dims) \
753
{ \
754
if (! is_valid_bsxfun ("operator .^", a_dims, b_dims)) \
755
octave::err_nonconformant ("operator .^", a_dims, b_dims); \
756
\
757
return bsxfun_pow (a, b); \
758
} \
759
T1 ## NDArray result (a_dims); \
760
for (int i = 0; i < a.numel (); i++) \
761
{ \
762
octave_quit (); \
763
result (i) = pow (a(i), b(i)); \
764
} \
765
return octave_value (result); \
766
} \
767
\
768
octave_value \
769
elem_xpow (const NDArray& a, const T2 ## NDArray& b) \
770
{ \
771
dim_vector a_dims = a.dims (); \
772
dim_vector b_dims = b.dims (); \
773
if (a_dims != b_dims) \
774
{ \
775
if (! is_valid_bsxfun ("operator .^", a_dims, b_dims)) \
776
octave::err_nonconformant ("operator .^", a_dims, b_dims); \
777
\
778
return bsxfun_pow (a, b); \
779
} \
780
T2 ## NDArray result (a_dims); \
781
for (int i = 0; i < a.numel (); i++) \
782
{ \
783
octave_quit (); \
784
result (i) = pow (a(i), b(i)); \
785
} \
786
return octave_value (result); \
787
} \
788
\
789
octave_value \
790
elem_xpow (const T1 ## NDArray& a, const FloatNDArray& b) \
791
{ \
792
dim_vector a_dims = a.dims (); \
793
dim_vector b_dims = b.dims (); \
794
if (a_dims != b_dims) \
795
{ \
796
if (! is_valid_bsxfun ("operator .^", a_dims, b_dims)) \
797
octave::err_nonconformant ("operator .^", a_dims, b_dims); \
798
\
799
return bsxfun_pow (a, b); \
800
} \
801
T1 ## NDArray result (a_dims); \
802
for (int i = 0; i < a.numel (); i++) \
803
{ \
804
octave_quit (); \
805
result (i) = powf (a(i), b(i)); \
806
} \
807
return octave_value (result); \
808
} \
809
\
810
octave_value \
811
elem_xpow (const FloatNDArray& a, const T2 ## NDArray& b) \
812
{ \
813
dim_vector a_dims = a.dims (); \
814
dim_vector b_dims = b.dims (); \
815
if (a_dims != b_dims) \
816
{ \
817
if (! is_valid_bsxfun ("operator .^", a_dims, b_dims)) \
818
octave::err_nonconformant ("operator .^", a_dims, b_dims); \
819
\
820
return bsxfun_pow (a, b); \
821
} \
822
T2 ## NDArray result (a_dims); \
823
for (int i = 0; i < a.numel (); i++) \
824
{ \
825
octave_quit (); \
826
result (i) = powf (a(i), b(i)); \
827
} \
828
return octave_value (result); \
829
}
830
831
#define OCTAVE_MM_CONV(T1, T2) \
832
DEFCONV (T1 ## m_ ## T2 ## m_conv, T1 ## matrix, T2 ## matrix) \
833
{ \
834
const octave_ ## T1 ## matrix& v = dynamic_cast<const octave_ ## T1 ## matrix&> (a); \
835
\
836
return new octave_ ## T2 ## matrix (v.T2 ## array_value ()); \
837
}
838
839
#define OCTAVE_MM_INT_OPS(TYPE) \
840
OCTAVE_M_INT_UNOPS (TYPE) \
841
OCTAVE_MM_POW_OPS (TYPE, TYPE) \
842
OCTAVE_MM_INT_ARITH_OPS (mm, TYPE ## _, TYPE ## _, TYPE) \
843
OCTAVE_MM_INT_ARITH_OPS (mmx, TYPE ## _, , TYPE) \
844
OCTAVE_MM_INT_ARITH_OPS (mxm, , TYPE ## _, TYPE) \
845
OCTAVE_MM_INT_ARITH_OPS (mmfx, TYPE ## _, float_, TYPE) \
846
OCTAVE_MM_INT_ARITH_OPS (mfxm, float_, TYPE ## _, TYPE) \
847
OCTAVE_MM_INT_CMP_OPS (mm, TYPE ## _, TYPE ## _) \
848
OCTAVE_MM_INT_CMP_OPS (mmx, TYPE ## _, ) \
849
OCTAVE_MM_INT_CMP_OPS (mfxm, float_, TYPE ## _) \
850
OCTAVE_MM_INT_CMP_OPS (mmfx, TYPE ## _, float_) \
851
OCTAVE_MM_INT_CMP_OPS (mxm, , TYPE ## _) \
852
OCTAVE_MM_INT_BOOL_OPS (mm, TYPE ## _, TYPE ## _) \
853
OCTAVE_MM_INT_BOOL_OPS (mmx, TYPE ## _, ) \
854
OCTAVE_MM_INT_BOOL_OPS (mxm, , TYPE ## _) \
855
OCTAVE_MM_INT_BOOL_OPS (mmfx, TYPE ## _, float_) \
856
OCTAVE_MM_INT_BOOL_OPS (mfxm, float_, TYPE ## _) \
857
OCTAVE_MM_INT_ASSIGN_OPS (mm, TYPE ## _, TYPE ## _, TYPE ## _) \
858
OCTAVE_MM_INT_ASSIGNEQ_OPS (mme, TYPE ## _) \
859
OCTAVE_MM_INT_ASSIGN_OPS (mmx, TYPE ## _, , ) \
860
OCTAVE_MM_INT_ASSIGN_OPS (mmfx, TYPE ## _, float_, float_) \
861
OCTAVE_MM_CONV(TYPE ## _, complex_) \
862
OCTAVE_MM_CONV(TYPE ## _, float_complex_)
863
864
#define OCTAVE_RE_INT_ASSIGN_OPS(TYPE) \
865
DEFNDASSIGNOP_FN (TYPE ## ms_assign, matrix, TYPE ## _scalar, array, assign) \
866
DEFNDASSIGNOP_FN (TYPE ## mm_assign, matrix, TYPE ## _matrix, array, assign)
867
868
#define OCTAVE_FLT_RE_INT_ASSIGN_OPS(TYPE) \
869
DEFNDASSIGNOP_FN (TYPE ## fms_assign, float_matrix, TYPE ## _scalar, float_array, assign) \
870
DEFNDASSIGNOP_FN (TYPE ## fmm_assign, float_matrix, TYPE ## _matrix, float_array, assign)
871
872
#define OCTAVE_CX_INT_ASSIGN_OPS(TYPE) \
873
DEFNDASSIGNOP_FN (TYPE ## cms_assign, complex_matrix, TYPE ## _scalar, complex_array, assign) \
874
DEFNDASSIGNOP_FN (TYPE ## cmm_assign, complex_matrix, TYPE ## _matrix, complex_array, assign)
875
876
#define OCTAVE_FLT_CX_INT_ASSIGN_OPS(TYPE) \
877
DEFNDASSIGNOP_FN (TYPE ## fcms_assign, float_complex_matrix, TYPE ## _scalar, float_complex_array, assign) \
878
DEFNDASSIGNOP_FN (TYPE ## fcmm_assign, float_complex_matrix, TYPE ## _matrix, float_complex_array, assign)
879
880
#define OCTAVE_INT_NULL_ASSIGN_OPS(TYPE) \
881
DEFNULLASSIGNOP_FN (TYPE ## null_assign, TYPE ## _matrix, delete_elements)
882
883
#define OCTAVE_INT_OPS(TYPE) \
884
OCTAVE_SS_INT_OPS (TYPE) \
885
OCTAVE_SM_INT_OPS (TYPE) \
886
OCTAVE_MS_INT_OPS (TYPE) \
887
OCTAVE_MM_INT_OPS (TYPE) \
888
OCTAVE_CONCAT_FN (TYPE) \
889
OCTAVE_RE_INT_ASSIGN_OPS (TYPE) \
890
OCTAVE_FLT_RE_INT_ASSIGN_OPS (TYPE) \
891
OCTAVE_CX_INT_ASSIGN_OPS (TYPE) \
892
OCTAVE_FLT_CX_INT_ASSIGN_OPS (TYPE) \
893
OCTAVE_INT_NULL_ASSIGN_OPS(TYPE)
894
895
#define OCTAVE_INSTALL_S_INT_UNOPS(TYPE) \
896
INSTALL_UNOP_TI (ti, op_not, octave_ ## TYPE ## _scalar, s_not); \
897
INSTALL_UNOP_TI (ti, op_uplus, octave_ ## TYPE ## _scalar, s_uplus); \
898
INSTALL_UNOP_TI (ti, op_uminus, octave_ ## TYPE ## _scalar, s_uminus); \
899
INSTALL_UNOP_TI (ti, op_transpose, octave_ ## TYPE ## _scalar, s_transpose); \
900
INSTALL_UNOP_TI (ti, op_hermitian, octave_ ## TYPE ## _scalar, s_hermitian); \
901
\
902
INSTALL_NCUNOP_TI (ti, op_incr, octave_ ## TYPE ## _scalar, s_incr); \
903
INSTALL_NCUNOP_TI (ti, op_decr, octave_ ## TYPE ## _scalar, s_decr);
904
905
#define OCTAVE_INSTALL_SS_INT_ARITH_OPS(PFX, T1, T2) \
906
INSTALL_BINOP_TI (ti, op_add, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _add); \
907
INSTALL_BINOP_TI (ti, op_sub, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _sub); \
908
INSTALL_BINOP_TI (ti, op_mul, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _mul); \
909
INSTALL_BINOP_TI (ti, op_div, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _div); \
910
INSTALL_BINOP_TI (ti, op_pow, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _pow); \
911
INSTALL_BINOP_TI (ti, op_ldiv, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _ldiv); \
912
INSTALL_BINOP_TI (ti, op_el_mul, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _el_mul); \
913
INSTALL_BINOP_TI (ti, op_el_div, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _el_div); \
914
INSTALL_BINOP_TI (ti, op_el_pow, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _el_pow); \
915
INSTALL_BINOP_TI (ti, op_el_ldiv, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _el_ldiv);
916
917
#define OCTAVE_INSTALL_SS_INT_CMP_OPS(PFX, T1, T2) \
918
INSTALL_BINOP_TI (ti, op_lt, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _lt); \
919
INSTALL_BINOP_TI (ti, op_le, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _le); \
920
INSTALL_BINOP_TI (ti, op_eq, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _eq); \
921
INSTALL_BINOP_TI (ti, op_ge, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _ge); \
922
INSTALL_BINOP_TI (ti, op_gt, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _gt); \
923
INSTALL_BINOP_TI (ti, op_ne, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _ne);
924
925
#define OCTAVE_INSTALL_SS_INT_BOOL_OPS(PFX, T1, T2) \
926
INSTALL_BINOP_TI (ti, op_el_and, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _el_and); \
927
INSTALL_BINOP_TI (ti, op_el_or, octave_ ## T1 ## scalar, octave_ ## T2 ## scalar, PFX ## _el_or);
928
929
#define OCTAVE_INSTALL_SS_INT_OPS(TYPE) \
930
OCTAVE_INSTALL_S_INT_UNOPS (TYPE) \
931
OCTAVE_INSTALL_SS_INT_ARITH_OPS (ss, TYPE ## _, TYPE ## _) \
932
OCTAVE_INSTALL_SS_INT_ARITH_OPS (ssx, TYPE ## _, ) \
933
OCTAVE_INSTALL_SS_INT_ARITH_OPS (sxs, , TYPE ## _) \
934
OCTAVE_INSTALL_SS_INT_ARITH_OPS (ssfx, TYPE ## _, float_) \
935
OCTAVE_INSTALL_SS_INT_ARITH_OPS (sfxs, float_, TYPE ## _) \
936
OCTAVE_INSTALL_SS_INT_CMP_OPS (ss, TYPE ## _, TYPE ## _) \
937
OCTAVE_INSTALL_SS_INT_CMP_OPS (sx, TYPE ## _, ) \
938
OCTAVE_INSTALL_SS_INT_CMP_OPS (xs, , TYPE ## _) \
939
OCTAVE_INSTALL_SS_INT_CMP_OPS (sfx, TYPE ## _, float_) \
940
OCTAVE_INSTALL_SS_INT_CMP_OPS (fxs, float_, TYPE ## _) \
941
OCTAVE_INSTALL_SS_INT_BOOL_OPS (ss, TYPE ## _, TYPE ## _) \
942
OCTAVE_INSTALL_SS_INT_BOOL_OPS (sx, TYPE ## _, ) \
943
OCTAVE_INSTALL_SS_INT_BOOL_OPS (xs, , TYPE ## _) \
944
OCTAVE_INSTALL_SS_INT_BOOL_OPS (sfx, TYPE ## _, float_) \
945
OCTAVE_INSTALL_SS_INT_BOOL_OPS (fxs, float_, TYPE ## _) \
946
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_ ## TYPE ## _scalar, octave_ ## TYPE ## _matrix) \
947
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_scalar, octave_ ## TYPE ## _matrix) \
948
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_float_scalar, octave_ ## TYPE ## _matrix) \
949
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_complex_scalar, octave_complex_matrix) \
950
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_float_complex_scalar, octave_float_complex_matrix)
951
952
#define OCTAVE_INSTALL_SM_INT_ARITH_OPS(PFX, T1, T2) \
953
INSTALL_BINOP_TI (ti, op_add, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _add); \
954
INSTALL_BINOP_TI (ti, op_sub, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _sub); \
955
INSTALL_BINOP_TI (ti, op_mul, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _mul); \
956
/* INSTALL_BINOP_TI (ti, op_div, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _div); */
\
957
/* INSTALL_BINOP_TI (ti, op_pow, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _pow); */
\
958
INSTALL_BINOP_TI (ti, op_ldiv, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _ldiv); \
959
INSTALL_BINOP_TI (ti, op_el_mul, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _el_mul); \
960
INSTALL_BINOP_TI (ti, op_el_div, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _el_div); \
961
INSTALL_BINOP_TI (ti, op_el_pow, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _el_pow); \
962
INSTALL_BINOP_TI (ti, op_el_ldiv, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _el_ldiv);
963
964
#define OCTAVE_INSTALL_SM_INT_CMP_OPS(PFX, T1, T2) \
965
INSTALL_BINOP_TI (ti, op_lt, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _lt); \
966
INSTALL_BINOP_TI (ti, op_le, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _le); \
967
INSTALL_BINOP_TI (ti, op_eq, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _eq); \
968
INSTALL_BINOP_TI (ti, op_ge, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _ge); \
969
INSTALL_BINOP_TI (ti, op_gt, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _gt); \
970
INSTALL_BINOP_TI (ti, op_ne, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _ne);
971
972
#define OCTAVE_INSTALL_SM_INT_BOOL_OPS(PFX, T1, T2) \
973
INSTALL_BINOP_TI (ti, op_el_and, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _el_and); \
974
INSTALL_BINOP_TI (ti, op_el_or, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _el_or); \
975
INSTALL_BINOP_TI (ti, op_el_and_not, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _el_and_not); \
976
INSTALL_BINOP_TI (ti, op_el_or_not, octave_ ## T1 ## scalar, octave_ ## T2 ## matrix, PFX ## _el_or_not);
977
978
#define OCTAVE_INSTALL_SM_INT_OPS(TYPE) \
979
OCTAVE_INSTALL_SM_INT_ARITH_OPS (sm, TYPE ## _, TYPE ## _) \
980
OCTAVE_INSTALL_SM_INT_ARITH_OPS (smx, TYPE ## _, ) \
981
OCTAVE_INSTALL_SM_INT_ARITH_OPS (sxm, , TYPE ## _) \
982
OCTAVE_INSTALL_SM_INT_ARITH_OPS (smfx, TYPE ## _, float_) \
983
OCTAVE_INSTALL_SM_INT_ARITH_OPS (sfxm, float_, TYPE ## _) \
984
OCTAVE_INSTALL_SM_INT_CMP_OPS (sm, TYPE ## _, TYPE ## _) \
985
OCTAVE_INSTALL_SM_INT_CMP_OPS (xm, , TYPE ## _) \
986
OCTAVE_INSTALL_SM_INT_CMP_OPS (smx, TYPE ## _, ) \
987
OCTAVE_INSTALL_SM_INT_CMP_OPS (fxm, float_, TYPE ## _) \
988
OCTAVE_INSTALL_SM_INT_CMP_OPS (smfx, TYPE ## _, float_) \
989
OCTAVE_INSTALL_SM_INT_BOOL_OPS (sm, TYPE ## _, TYPE ## _) \
990
OCTAVE_INSTALL_SM_INT_BOOL_OPS (xm, , TYPE ## _) \
991
OCTAVE_INSTALL_SM_INT_BOOL_OPS (smx, TYPE ## _, ) \
992
OCTAVE_INSTALL_SM_INT_BOOL_OPS (fxm, float_, TYPE ## _) \
993
OCTAVE_INSTALL_SM_INT_BOOL_OPS (smfx, TYPE ## _, float_) \
994
INSTALL_WIDENOP_TI (ti, octave_ ## TYPE ## _scalar, octave_ ## TYPE ## _matrix, TYPE ## _s_ ## TYPE ## _m_conv) \
995
INSTALL_WIDENOP_TI (ti, octave_ ## TYPE ## _scalar, octave_complex_matrix, TYPE ## _s_complex_m_conv) \
996
INSTALL_WIDENOP_TI (ti, octave_ ## TYPE ## _scalar, octave_float_complex_matrix, TYPE ## _s_float_complex_m_conv) \
997
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_ ## TYPE ## _matrix, octave_ ## TYPE ## _matrix) \
998
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_matrix, octave_ ## TYPE ## _matrix) \
999
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_float_matrix, octave_ ## TYPE ## _matrix) \
1000
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_complex_matrix, octave_complex_matrix) \
1001
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_float_complex_matrix, octave_float_complex_matrix)
1002
1003
#define OCTAVE_INSTALL_MS_INT_ARITH_OPS(PFX, T1, T2) \
1004
INSTALL_BINOP_TI (ti, op_add, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _add); \
1005
INSTALL_BINOP_TI (ti, op_sub, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _sub); \
1006
INSTALL_BINOP_TI (ti, op_mul, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _mul); \
1007
INSTALL_BINOP_TI (ti, op_div, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _div); \
1008
/* INSTALL_BINOP_TI (ti, op_pow, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _pow); */
\
1009
/* INSTALL_BINOP_TI (ti, op_ldiv, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _ldiv); */
\
1010
\
1011
INSTALL_BINOP_TI (ti, op_el_mul, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _el_mul); \
1012
INSTALL_BINOP_TI (ti, op_el_div, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _el_div); \
1013
INSTALL_BINOP_TI (ti, op_el_pow, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _el_pow); \
1014
INSTALL_BINOP_TI (ti, op_el_ldiv, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _el_ldiv);
1015
1016
#define OCTAVE_INSTALL_MS_INT_CMP_OPS(PFX, T1, T2) \
1017
INSTALL_BINOP_TI (ti, op_lt, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _lt); \
1018
INSTALL_BINOP_TI (ti, op_le, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _le); \
1019
INSTALL_BINOP_TI (ti, op_eq, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _eq); \
1020
INSTALL_BINOP_TI (ti, op_ge, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _ge); \
1021
INSTALL_BINOP_TI (ti, op_gt, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _gt); \
1022
INSTALL_BINOP_TI (ti, op_ne, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _ne);
1023
1024
#define OCTAVE_INSTALL_MS_INT_BOOL_OPS(PFX, T1, T2) \
1025
INSTALL_BINOP_TI (ti, op_el_and, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _el_and); \
1026
INSTALL_BINOP_TI (ti, op_el_or, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _el_or); \
1027
INSTALL_BINOP_TI (ti, op_el_not_and, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _el_not_and); \
1028
INSTALL_BINOP_TI (ti, op_el_not_or, octave_ ## T1 ## matrix, octave_ ## T2 ## scalar, PFX ## _el_not_or);
1029
1030
#define OCTAVE_INSTALL_MS_INT_ASSIGN_OPS(PFX, TLHS, TRHS) \
1031
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## scalar, PFX ## _assign)
1032
1033
#define OCTAVE_INSTALL_MS_INT_ASSIGNEQ_OPS(PFX, TLHS, TRHS) \
1034
INSTALL_ASSIGNOP_TI (ti, op_add_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## scalar, PFX ## _assign_add) \
1035
INSTALL_ASSIGNOP_TI (ti, op_sub_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## scalar, PFX ## _assign_sub) \
1036
INSTALL_ASSIGNOP_TI (ti, op_mul_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## scalar, PFX ## _assign_mul) \
1037
INSTALL_ASSIGNOP_TI (ti, op_div_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## scalar, PFX ## _assign_div)
1038
1039
#define OCTAVE_INSTALL_MS_INT_OPS(TYPE) \
1040
OCTAVE_INSTALL_MS_INT_ARITH_OPS (ms, TYPE ## _, TYPE ## _) \
1041
OCTAVE_INSTALL_MS_INT_ARITH_OPS (msx, TYPE ## _, ) \
1042
OCTAVE_INSTALL_MS_INT_ARITH_OPS (mxs, , TYPE ## _) \
1043
OCTAVE_INSTALL_MS_INT_ARITH_OPS (msfx, TYPE ## _, float_) \
1044
OCTAVE_INSTALL_MS_INT_ARITH_OPS (mfxs, float_, TYPE ## _) \
1045
OCTAVE_INSTALL_MS_INT_CMP_OPS (ms, TYPE ## _, TYPE ## _) \
1046
OCTAVE_INSTALL_MS_INT_CMP_OPS (mx, TYPE ## _, ) \
1047
OCTAVE_INSTALL_MS_INT_CMP_OPS (mxs, , TYPE ## _) \
1048
OCTAVE_INSTALL_MS_INT_CMP_OPS (mfx, TYPE ## _, float_) \
1049
OCTAVE_INSTALL_MS_INT_CMP_OPS (mfxs, float_, TYPE ## _) \
1050
OCTAVE_INSTALL_MS_INT_BOOL_OPS (ms, TYPE ## _, TYPE ## _) \
1051
OCTAVE_INSTALL_MS_INT_BOOL_OPS (mx, TYPE ## _, ) \
1052
OCTAVE_INSTALL_MS_INT_BOOL_OPS (mxs, , TYPE ## _) \
1053
OCTAVE_INSTALL_MS_INT_BOOL_OPS (mfx, TYPE ## _, float_) \
1054
OCTAVE_INSTALL_MS_INT_BOOL_OPS (mfxs, float_, TYPE ## _) \
1055
OCTAVE_INSTALL_MS_INT_ASSIGN_OPS (ms, TYPE ## _, TYPE ## _) \
1056
OCTAVE_INSTALL_MS_INT_ASSIGNEQ_OPS (mse, TYPE ## _, TYPE ## _) \
1057
OCTAVE_INSTALL_MS_INT_ASSIGN_OPS (mx, TYPE ## _, ) \
1058
OCTAVE_INSTALL_MS_INT_ASSIGN_OPS (mfx, TYPE ## _, float_) \
1059
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _matrix, octave_complex_scalar, octave_complex_matrix) \
1060
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _matrix, octave_float_complex_scalar, octave_float_complex_matrix)
1061
1062
#define OCTAVE_INSTALL_M_INT_UNOPS(TYPE) \
1063
INSTALL_UNOP_TI (ti, op_not, octave_ ## TYPE ## _matrix, m_not); \
1064
INSTALL_UNOP_TI (ti, op_uplus, octave_ ## TYPE ## _matrix, m_uplus); \
1065
INSTALL_UNOP_TI (ti, op_uminus, octave_ ## TYPE ## _matrix, m_uminus); \
1066
INSTALL_UNOP_TI (ti, op_transpose, octave_ ## TYPE ## _matrix, m_transpose); \
1067
INSTALL_UNOP_TI (ti, op_hermitian, octave_ ## TYPE ## _matrix, m_transpose); \
1068
\
1069
INSTALL_NCUNOP_TI (ti, op_incr, octave_ ## TYPE ## _matrix, m_incr); \
1070
INSTALL_NCUNOP_TI (ti, op_decr, octave_ ## TYPE ## _matrix, m_decr); \
1071
INSTALL_NCUNOP_TI (ti, op_uminus, octave_ ## TYPE ## _matrix, m_changesign);
1072
1073
#define OCTAVE_INSTALL_MM_INT_ARITH_OPS(PFX, T1, T2) \
1074
INSTALL_BINOP_TI (ti, op_add, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _add); \
1075
INSTALL_BINOP_TI (ti, op_sub, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _sub); \
1076
/* INSTALL_BINOP_TI (ti, op_mul, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _mul); */
\
1077
/* INSTALL_BINOP_TI (ti, op_div, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _div); */
\
1078
INSTALL_BINOP_TI (ti, op_pow, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _pow); \
1079
/* INSTALL_BINOP_TI (ti, op_ldiv, octave_ ## T1 ## _matrix, octave_ ## T2 ## _matrix, mm_ldiv); */
\
1080
INSTALL_BINOP_TI (ti, op_el_mul, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_mul); \
1081
INSTALL_BINOP_TI (ti, op_el_div, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_div); \
1082
INSTALL_BINOP_TI (ti, op_el_pow, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_pow); \
1083
INSTALL_BINOP_TI (ti, op_el_ldiv, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_ldiv);
1084
1085
#define OCTAVE_INSTALL_MM_INT_CMP_OPS(PFX, T1, T2) \
1086
INSTALL_BINOP_TI (ti, op_lt, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _lt); \
1087
INSTALL_BINOP_TI (ti, op_le, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _le); \
1088
INSTALL_BINOP_TI (ti, op_eq, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _eq); \
1089
INSTALL_BINOP_TI (ti, op_ge, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _ge); \
1090
INSTALL_BINOP_TI (ti, op_gt, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _gt); \
1091
INSTALL_BINOP_TI (ti, op_ne, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _ne);
1092
1093
#define OCTAVE_INSTALL_MM_INT_BOOL_OPS(PFX, T1, T2) \
1094
INSTALL_BINOP_TI (ti, op_el_and, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_and); \
1095
INSTALL_BINOP_TI (ti, op_el_or, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_or); \
1096
INSTALL_BINOP_TI (ti, op_el_not_and, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_not_and); \
1097
INSTALL_BINOP_TI (ti, op_el_not_or, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_not_or); \
1098
INSTALL_BINOP_TI (ti, op_el_and_not, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_and_not); \
1099
INSTALL_BINOP_TI (ti, op_el_or_not, octave_ ## T1 ## matrix, octave_ ## T2 ## matrix, PFX ## _el_or_not);
1100
1101
#define OCTAVE_INSTALL_MM_INT_ASSIGN_OPS(PFX, TLHS, TRHS) \
1102
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## matrix, PFX ## _assign)
1103
1104
#define OCTAVE_INSTALL_MM_INT_ASSIGNEQ_OPS(PFX, TLHS, TRHS) \
1105
INSTALL_ASSIGNOP_TI (ti, op_add_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## matrix, PFX ## _assign_add) \
1106
INSTALL_ASSIGNOP_TI (ti, op_sub_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## matrix, PFX ## _assign_sub) \
1107
INSTALL_ASSIGNOP_TI (ti, op_el_mul_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## matrix, PFX ## _assign_el_mul) \
1108
INSTALL_ASSIGNOP_TI (ti, op_el_div_eq, octave_ ## TLHS ## matrix, octave_ ## TRHS ## matrix, PFX ## _assign_el_div)
1109
1110
#define OCTAVE_INSTALL_MM_INT_OPS(TYPE) \
1111
OCTAVE_INSTALL_M_INT_UNOPS (TYPE) \
1112
OCTAVE_INSTALL_MM_INT_ARITH_OPS (mm, TYPE ##_, TYPE ## _) \
1113
OCTAVE_INSTALL_MM_INT_ARITH_OPS (mmx, TYPE ##_, ) \
1114
OCTAVE_INSTALL_MM_INT_ARITH_OPS (mxm, , TYPE ##_) \
1115
OCTAVE_INSTALL_MM_INT_ARITH_OPS (mmfx, TYPE ##_, float_) \
1116
OCTAVE_INSTALL_MM_INT_ARITH_OPS (mfxm, float_, TYPE ##_) \
1117
OCTAVE_INSTALL_MM_INT_CMP_OPS (mm, TYPE ## _, TYPE ## _) \
1118
OCTAVE_INSTALL_MM_INT_CMP_OPS (mmx, TYPE ## _, ) \
1119
OCTAVE_INSTALL_MM_INT_CMP_OPS (mxm, , TYPE ## _) \
1120
OCTAVE_INSTALL_MM_INT_CMP_OPS (mmfx, TYPE ## _, float_) \
1121
OCTAVE_INSTALL_MM_INT_CMP_OPS (mfxm, float_, TYPE ## _) \
1122
OCTAVE_INSTALL_MM_INT_BOOL_OPS (mm, TYPE ## _, TYPE ## _) \
1123
OCTAVE_INSTALL_MM_INT_BOOL_OPS (mmx, TYPE ## _, ) \
1124
OCTAVE_INSTALL_MM_INT_BOOL_OPS (mxm, , TYPE ## _) \
1125
OCTAVE_INSTALL_MM_INT_BOOL_OPS (mmfx, TYPE ## _, float_) \
1126
OCTAVE_INSTALL_MM_INT_BOOL_OPS (mfxm, float_, TYPE ## _) \
1127
OCTAVE_INSTALL_MM_INT_ASSIGN_OPS (mm, TYPE ## _, TYPE ## _) \
1128
OCTAVE_INSTALL_MM_INT_ASSIGNEQ_OPS (mme, TYPE ## _, TYPE ## _) \
1129
OCTAVE_INSTALL_MM_INT_ASSIGN_OPS (mmx, TYPE ## _, ) \
1130
OCTAVE_INSTALL_MM_INT_ASSIGN_OPS (mmfx, TYPE ## _, float_) \
1131
INSTALL_WIDENOP_TI (ti, octave_ ## TYPE ## _matrix, octave_complex_matrix, TYPE ## _m_complex_m_conv) \
1132
INSTALL_WIDENOP_TI (ti, octave_ ## TYPE ## _matrix, octave_float_complex_matrix, TYPE ## _m_float_complex_m_conv) \
1133
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _matrix, octave_complex_matrix, octave_complex_matrix) \
1134
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _matrix, octave_float_complex_matrix, octave_float_complex_matrix)
1135
1136
#define OCTAVE_INSTALL_RE_INT_ASSIGN_OPS(TYPE) \
1137
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_matrix, octave_ ## TYPE ## _scalar, TYPE ## ms_assign) \
1138
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_matrix, octave_ ## TYPE ## _matrix, TYPE ## mm_assign) \
1139
INSTALL_ASSIGNCONV_TI (ti, octave_scalar, octave_ ## TYPE ## _scalar, octave_matrix) \
1140
INSTALL_ASSIGNCONV_TI (ti, octave_matrix, octave_ ## TYPE ## _matrix, octave_matrix)
1141
1142
#define OCTAVE_INSTALL_FLT_RE_INT_ASSIGN_OPS(TYPE) \
1143
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_float_matrix, octave_ ## TYPE ## _scalar, TYPE ## fms_assign) \
1144
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_float_matrix, octave_ ## TYPE ## _matrix, TYPE ## fmm_assign) \
1145
INSTALL_ASSIGNCONV_TI (ti, octave_float_scalar, octave_ ## TYPE ## _scalar, octave_float_matrix) \
1146
INSTALL_ASSIGNCONV_TI (ti, octave_float_matrix, octave_ ## TYPE ## _matrix, octave_float_matrix)
1147
1148
#define OCTAVE_INSTALL_CX_INT_ASSIGN_OPS(TYPE) \
1149
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_complex_matrix, octave_ ## TYPE ## _scalar, TYPE ## cms_assign) \
1150
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_complex_matrix, octave_ ## TYPE ## _matrix, TYPE ## cmm_assign) \
1151
INSTALL_ASSIGNCONV_TI (ti, octave_complex_scalar, octave_ ## TYPE ## _scalar, octave_complex_matrix) \
1152
INSTALL_ASSIGNCONV_TI (ti, octave_complex_matrix, octave_ ## TYPE ## _matrix, octave_complex_matrix)
1153
1154
#define OCTAVE_INSTALL_FLT_CX_INT_ASSIGN_OPS(TYPE) \
1155
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_float_complex_matrix, octave_ ## TYPE ## _scalar, TYPE ## fcms_assign) \
1156
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_float_complex_matrix, octave_ ## TYPE ## _matrix, TYPE ## fcmm_assign) \
1157
INSTALL_ASSIGNCONV_TI (ti, octave_float_complex_scalar, octave_ ## TYPE ## _scalar, octave_complex_matrix) \
1158
INSTALL_ASSIGNCONV_TI (ti, octave_float_complex_matrix, octave_ ## TYPE ## _matrix, octave_complex_matrix)
1159
1160
#define OCTAVE_INSTALL_INT_NULL_ASSIGN_OPS(TYPE) \
1161
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_ ## TYPE ## _matrix, octave_null_matrix, TYPE ## null_assign) \
1162
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_ ## TYPE ## _matrix, octave_null_str, TYPE ## null_assign) \
1163
INSTALL_ASSIGNOP_TI (ti, op_asn_eq, octave_ ## TYPE ## _matrix, octave_null_sq_str, TYPE ## null_assign) \
1164
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TYPE ## _scalar, octave_null_matrix, octave_ ## TYPE ## _matrix) \
1165
INSTALL_ASSIGNCONV_TI (ti, octave_## TYPE ## _scalar, octave_null_str, octave_ ## TYPE ## _matrix) \
1166
INSTALL_ASSIGNCONV_TI (ti, octave_## TYPE ## _scalar, octave_null_sq_str, octave_ ## TYPE ## _matrix)
1167
1168
#define OCTAVE_INSTALL_INT_OPS(TYPE) \
1169
OCTAVE_INSTALL_SS_INT_OPS (TYPE) \
1170
OCTAVE_INSTALL_SM_INT_OPS (TYPE) \
1171
OCTAVE_INSTALL_MS_INT_OPS (TYPE) \
1172
OCTAVE_INSTALL_MM_INT_OPS (TYPE) \
1173
OCTAVE_INSTALL_CONCAT_FN (TYPE) \
1174
OCTAVE_INSTALL_RE_INT_ASSIGN_OPS (TYPE) \
1175
OCTAVE_INSTALL_FLT_RE_INT_ASSIGN_OPS (TYPE) \
1176
OCTAVE_INSTALL_CX_INT_ASSIGN_OPS (TYPE) \
1177
OCTAVE_INSTALL_FLT_CX_INT_ASSIGN_OPS (TYPE) \
1178
OCTAVE_INSTALL_INT_NULL_ASSIGN_OPS(TYPE)
1179
1180
#define OCTAVE_INSTALL_SM_INT_ASSIGNCONV(TLHS, TRHS) \
1181
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TLHS ## _scalar, octave_ ## TRHS ## _scalar, octave_ ## TLHS ## _matrix) \
1182
INSTALL_ASSIGNCONV_TI (ti, octave_ ## TLHS ## _scalar, octave_ ## TRHS ## _matrix, octave_ ## TLHS ## _matrix)
1183
1184
#define OCTAVE_MIXED_INT_CMP_OPS(T1, T2) \
1185
OCTAVE_SS_INT_CMP_OPS (T1 ## _ ## T2 ## _ss, T1 ## _, T2 ## _) \
1186
OCTAVE_SM_INT_CMP_OPS (T1 ## _ ## T2 ## _sm, T1 ## _, T2 ## _) \
1187
OCTAVE_MS_INT_CMP_OPS (T1 ## _ ## T2 ## _ms, T1 ## _, T2 ## _) \
1188
OCTAVE_MM_INT_CMP_OPS (T1 ## _ ## T2 ## _mm, T1 ## _, T2 ## _)
1189
1190
#define OCTAVE_INSTALL_MIXED_INT_CMP_OPS(T1, T2) \
1191
OCTAVE_INSTALL_SS_INT_CMP_OPS (T1 ## _ ## T2 ## _ss, T1 ## _, T2 ## _) \
1192
OCTAVE_INSTALL_SM_INT_CMP_OPS (T1 ## _ ## T2 ## _sm, T1 ## _, T2 ## _) \
1193
OCTAVE_INSTALL_MS_INT_CMP_OPS (T1 ## _ ## T2 ## _ms, T1 ## _, T2 ## _) \
1194
OCTAVE_INSTALL_MM_INT_CMP_OPS (T1 ## _ ## T2 ## _mm, T1 ## _, T2 ## _)
1195
1196
#endif
bsxfun.h
quit.h
libinterp
operators
op-int.h
Generated on Sat Sep 1 2018 14:01:42 for GNU Octave by
1.8.14