Mercurial > hg > octave-nkf
annotate liboctave/operators/mx-op-defs.h @ 20830:b65888ec820e draft default tip gccjit
dmalcom gcc jit import
author | Stefan Mahr <dac922@gmx.de> |
---|---|
date | Fri, 27 Feb 2015 16:59:36 +0100 |
parents | 4197fc428c7d |
children |
rev | line source |
---|---|
2829 | 1 /* |
2 | |
19898
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19461
diff
changeset
|
3 Copyright (C) 1996-2015 John W. Eaton |
11523 | 4 Copyright (C) 2008-2009 Jaroslav Hajek |
5 Copyright (C) 2009-2010 VZLU Prague, a.s. | |
2829 | 6 |
7 This file is part of Octave. | |
8 | |
9 Octave is free software; you can redistribute it and/or modify it | |
10 under the terms of the GNU General Public License as published by the | |
7016 | 11 Free Software Foundation; either version 3 of the License, or (at your |
12 option) any later version. | |
2829 | 13 |
14 Octave is distributed in the hope that it will be useful, but WITHOUT | |
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
17 for more details. | |
18 | |
19 You should have received a copy of the GNU General Public License | |
7016 | 20 along with Octave; see the file COPYING. If not, see |
21 <http://www.gnu.org/licenses/>. | |
2829 | 22 |
23 */ | |
24 | |
25 #if !defined (octave_mx_op_defs_h) | |
26 #define octave_mx_op_defs_h 1 | |
27 | |
19461
65554f5847ac
don't include oct-locbuf.h in header files unnecessarily
John W. Eaton <jwe@octave.org>
parents:
19039
diff
changeset
|
28 #include "lo-array-gripes.h" |
8774
b756ce0002db
split implementation and interface in mx-op-defs and MArray-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
8397
diff
changeset
|
29 #include "mx-op-decl.h" |
2829 | 30 #include "mx-inlines.cc" |
31 | |
10481
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
32 #define SNANCHK(s) \ |
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
33 if (xisnan (s)) \ |
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
34 gripe_nan_to_logical_conversion () |
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
35 |
10682
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
36 #define MNANCHK(m, MT) \ |
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
37 if (do_mx_check (m, mx_inline_any_nan<MT>)) \ |
10481
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
38 gripe_nan_to_logical_conversion () |
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
39 |
2870 | 40 // vector by scalar operations. |
41 | |
42 #define VS_BIN_OP(R, F, OP, V, S) \ | |
43 R \ | |
44 F (const V& v, const S& s) \ | |
45 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
46 return do_ms_binary_op<R::element_type, V::element_type, S> (v, s, OP); \ |
2870 | 47 } |
48 | |
49 #define VS_BIN_OPS(R, V, S) \ | |
9660
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
50 VS_BIN_OP (R, operator +, mx_inline_add, V, S) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
51 VS_BIN_OP (R, operator -, mx_inline_sub, V, S) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
52 VS_BIN_OP (R, operator *, mx_inline_mul, V, S) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
53 VS_BIN_OP (R, operator /, mx_inline_div, V, S) |
2870 | 54 |
55 // scalar by vector by operations. | |
56 | |
57 #define SV_BIN_OP(R, F, OP, S, V) \ | |
58 R \ | |
59 F (const S& s, const V& v) \ | |
60 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
61 return do_sm_binary_op<R::element_type, S, V::element_type> (s, v, OP); \ |
2870 | 62 } |
63 | |
64 #define SV_BIN_OPS(R, S, V) \ | |
9660
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
65 SV_BIN_OP (R, operator +, mx_inline_add, S, V) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
66 SV_BIN_OP (R, operator -, mx_inline_sub, S, V) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
67 SV_BIN_OP (R, operator *, mx_inline_mul, S, V) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
68 SV_BIN_OP (R, operator /, mx_inline_div, S, V) |
2870 | 69 |
70 // vector by vector operations. | |
71 | |
72 #define VV_BIN_OP(R, F, OP, V1, V2) \ | |
73 R \ | |
74 F (const V1& v1, const V2& v2) \ | |
75 { \ | |
13004
d9d65c3017c3
Make bsxfun automatic for most binary operators.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11523
diff
changeset
|
76 return do_mm_binary_op<R::element_type, V1::element_type, V2::element_type> (v1, v2, OP, OP, OP, #F); \ |
2870 | 77 } |
78 | |
79 #define VV_BIN_OPS(R, V1, V2) \ | |
9660
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
80 VV_BIN_OP (R, operator +, mx_inline_add, V1, V2) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
81 VV_BIN_OP (R, operator -, mx_inline_sub, V1, V2) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
82 VV_BIN_OP (R, product, mx_inline_mul, V1, V2) \ |
0256e187d13b
get rid of VS|SV|VV_BIN_OP macros in mx-op-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
9601
diff
changeset
|
83 VV_BIN_OP (R, quotient, mx_inline_div, V1, V2) |
2870 | 84 |
85 // matrix by scalar operations. | |
86 | |
87 #define MS_BIN_OP(R, OP, M, S, F) \ | |
2829 | 88 R \ |
89 OP (const M& m, const S& s) \ | |
90 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
91 return do_ms_binary_op<R::element_type, M::element_type, S> (m, s, F); \ |
2829 | 92 } |
93 | |
2870 | 94 #define MS_BIN_OPS(R, M, S) \ |
3769 | 95 MS_BIN_OP (R, operator +, M, S, mx_inline_add) \ |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
96 MS_BIN_OP (R, operator -, M, S, mx_inline_sub) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
97 MS_BIN_OP (R, operator *, M, S, mx_inline_mul) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
98 MS_BIN_OP (R, operator /, M, S, mx_inline_div) |
2870 | 99 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
100 #define MS_CMP_OP(F, OP, M, S) \ |
2870 | 101 boolMatrix \ |
102 F (const M& m, const S& s) \ | |
103 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
104 return do_ms_binary_op<bool, M::element_type, S> (m, s, OP); \ |
2870 | 105 } |
2829 | 106 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
107 #define MS_CMP_OPS(M, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
108 MS_CMP_OP (mx_el_lt, mx_inline_lt, M, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
109 MS_CMP_OP (mx_el_le, mx_inline_le, M, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
110 MS_CMP_OP (mx_el_ge, mx_inline_ge, M, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
111 MS_CMP_OP (mx_el_gt, mx_inline_gt, M, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
112 MS_CMP_OP (mx_el_eq, mx_inline_eq, M, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
113 MS_CMP_OP (mx_el_ne, mx_inline_ne, M, S) |
2870 | 114 |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
115 #define MS_BOOL_OP(F, OP, M, S) \ |
2870 | 116 boolMatrix \ |
117 F (const M& m, const S& s) \ | |
118 { \ | |
10682
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
119 MNANCHK (m, M::element_type); \ |
10481
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
120 SNANCHK (s); \ |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
121 return do_ms_binary_op<bool, M::element_type, S> (m, s, OP); \ |
2870 | 122 } |
123 | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
124 #define MS_BOOL_OPS(M, S) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
125 MS_BOOL_OP (mx_el_and, mx_inline_and, M, S) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
126 MS_BOOL_OP (mx_el_or, mx_inline_or, M, S) |
2870 | 127 |
128 // scalar by matrix operations. | |
129 | |
130 #define SM_BIN_OP(R, OP, S, M, F) \ | |
2829 | 131 R \ |
132 OP (const S& s, const M& m) \ | |
133 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
134 return do_sm_binary_op<R::element_type, S, M::element_type> (s, m, F); \ |
2829 | 135 } |
136 | |
2870 | 137 #define SM_BIN_OPS(R, S, M) \ |
3769 | 138 SM_BIN_OP (R, operator +, S, M, mx_inline_add) \ |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
139 SM_BIN_OP (R, operator -, S, M, mx_inline_sub) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
140 SM_BIN_OP (R, operator *, S, M, mx_inline_mul) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
141 SM_BIN_OP (R, operator /, S, M, mx_inline_div) |
2870 | 142 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
143 #define SM_CMP_OP(F, OP, S, M) \ |
2870 | 144 boolMatrix \ |
145 F (const S& s, const M& m) \ | |
146 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
147 return do_sm_binary_op<bool, S, M::element_type> (s, m, OP); \ |
2870 | 148 } |
2829 | 149 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
150 #define SM_CMP_OPS(S, M) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
151 SM_CMP_OP (mx_el_lt, mx_inline_lt, S, M) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
152 SM_CMP_OP (mx_el_le, mx_inline_le, S, M) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
153 SM_CMP_OP (mx_el_ge, mx_inline_ge, S, M) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
154 SM_CMP_OP (mx_el_gt, mx_inline_gt, S, M) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
155 SM_CMP_OP (mx_el_eq, mx_inline_eq, S, M) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
156 SM_CMP_OP (mx_el_ne, mx_inline_ne, S, M) |
2870 | 157 |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
158 #define SM_BOOL_OP(F, OP, S, M) \ |
2870 | 159 boolMatrix \ |
160 F (const S& s, const M& m) \ | |
161 { \ | |
10481
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
162 SNANCHK (s); \ |
10682
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
163 MNANCHK (m, M::element_type); \ |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
164 return do_sm_binary_op<bool, S, M::element_type> (s, m, OP); \ |
2870 | 165 } |
166 | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
167 #define SM_BOOL_OPS(S, M) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
168 SM_BOOL_OP (mx_el_and, mx_inline_and, S, M) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
169 SM_BOOL_OP (mx_el_or, mx_inline_or, S, M) |
2870 | 170 |
171 // matrix by matrix operations. | |
172 | |
173 #define MM_BIN_OP(R, OP, M1, M2, F) \ | |
2829 | 174 R \ |
175 OP (const M1& m1, const M2& m2) \ | |
176 { \ | |
13004
d9d65c3017c3
Make bsxfun automatic for most binary operators.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11523
diff
changeset
|
177 return do_mm_binary_op<R::element_type, M1::element_type, M2::element_type> (m1, m2, F, F, F, #OP); \ |
2829 | 178 } |
179 | |
2870 | 180 #define MM_BIN_OPS(R, M1, M2) \ |
3769 | 181 MM_BIN_OP (R, operator +, M1, M2, mx_inline_add) \ |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
182 MM_BIN_OP (R, operator -, M1, M2, mx_inline_sub) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
183 MM_BIN_OP (R, product, M1, M2, mx_inline_mul) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
184 MM_BIN_OP (R, quotient, M1, M2, mx_inline_div) |
2870 | 185 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
186 #define MM_CMP_OP(F, OP, M1, M2) \ |
2870 | 187 boolMatrix \ |
188 F (const M1& m1, const M2& m2) \ | |
189 { \ | |
13004
d9d65c3017c3
Make bsxfun automatic for most binary operators.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11523
diff
changeset
|
190 return do_mm_binary_op<bool, M1::element_type, M2::element_type> (m1, m2, OP, OP, OP, #F); \ |
2870 | 191 } |
2829 | 192 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
193 #define MM_CMP_OPS(M1, M2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
194 MM_CMP_OP (mx_el_lt, mx_inline_lt, M1, M2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
195 MM_CMP_OP (mx_el_le, mx_inline_le, M1, M2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
196 MM_CMP_OP (mx_el_ge, mx_inline_ge, M1, M2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
197 MM_CMP_OP (mx_el_gt, mx_inline_gt, M1, M2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
198 MM_CMP_OP (mx_el_eq, mx_inline_eq, M1, M2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
199 MM_CMP_OP (mx_el_ne, mx_inline_ne, M1, M2) |
2870 | 200 |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
201 #define MM_BOOL_OP(F, OP, M1, M2) \ |
2870 | 202 boolMatrix \ |
203 F (const M1& m1, const M2& m2) \ | |
204 { \ | |
10682
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
205 MNANCHK (m1, M1::element_type); \ |
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
206 MNANCHK (m2, M2::element_type); \ |
13004
d9d65c3017c3
Make bsxfun automatic for most binary operators.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11523
diff
changeset
|
207 return do_mm_binary_op<bool, M1::element_type, M2::element_type> (m1, m2, OP, OP, OP, #F); \ |
2870 | 208 } |
209 | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
210 #define MM_BOOL_OPS(M1, M2) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
211 MM_BOOL_OP (mx_el_and, mx_inline_and, M1, M2) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
212 MM_BOOL_OP (mx_el_or, mx_inline_or, M1, M2) |
2870 | 213 |
4543 | 214 // N-d matrix by scalar operations. |
215 | |
216 #define NDS_BIN_OP(R, OP, ND, S, F) \ | |
217 R \ | |
218 OP (const ND& m, const S& s) \ | |
219 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
220 return do_ms_binary_op<R::element_type, ND::element_type, S> (m, s, F); \ |
4543 | 221 } |
222 | |
223 #define NDS_BIN_OPS(R, ND, S) \ | |
224 NDS_BIN_OP (R, operator +, ND, S, mx_inline_add) \ | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
225 NDS_BIN_OP (R, operator -, ND, S, mx_inline_sub) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
226 NDS_BIN_OP (R, operator *, ND, S, mx_inline_mul) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
227 NDS_BIN_OP (R, operator /, ND, S, mx_inline_div) |
4543 | 228 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
229 #define NDS_CMP_OP(F, OP, ND, S) \ |
6119 | 230 boolNDArray \ |
231 F (const ND& m, const S& s) \ | |
232 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
233 return do_ms_binary_op<bool, ND::element_type, S> (m, s, OP); \ |
6119 | 234 } |
235 | |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
236 #define NDS_CMP_OPS(ND, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
237 NDS_CMP_OP (mx_el_lt, mx_inline_lt, ND, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
238 NDS_CMP_OP (mx_el_le, mx_inline_le, ND, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
239 NDS_CMP_OP (mx_el_ge, mx_inline_ge, ND, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
240 NDS_CMP_OP (mx_el_gt, mx_inline_gt, ND, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
241 NDS_CMP_OP (mx_el_eq, mx_inline_eq, ND, S) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
242 NDS_CMP_OP (mx_el_ne, mx_inline_ne, ND, S) |
6119 | 243 |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
244 #define NDS_BOOL_OP(F, OP, ND, S) \ |
4543 | 245 boolNDArray \ |
246 F (const ND& m, const S& s) \ | |
247 { \ | |
10682
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
248 MNANCHK (m, ND::element_type); \ |
10481
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
249 SNANCHK (s); \ |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
250 return do_ms_binary_op<bool, ND::element_type, S> (m, s, OP); \ |
4543 | 251 } |
252 | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
253 #define NDS_BOOL_OPS(ND, S) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
254 NDS_BOOL_OP (mx_el_and, mx_inline_and, ND, S) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
255 NDS_BOOL_OP (mx_el_or, mx_inline_or, ND, S) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
256 NDS_BOOL_OP (mx_el_not_and, mx_inline_not_and, ND, S) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
257 NDS_BOOL_OP (mx_el_not_or, mx_inline_not_or, ND, S) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
258 NDS_BOOL_OP (mx_el_and_not, mx_inline_and_not, ND, S) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
259 NDS_BOOL_OP (mx_el_or_not, mx_inline_or_not, ND, S) |
4543 | 260 |
261 // scalar by N-d matrix operations. | |
262 | |
263 #define SND_BIN_OP(R, OP, S, ND, F) \ | |
264 R \ | |
265 OP (const S& s, const ND& m) \ | |
266 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
267 return do_sm_binary_op<R::element_type, S, ND::element_type> (s, m, F); \ |
4543 | 268 } |
269 | |
270 #define SND_BIN_OPS(R, S, ND) \ | |
271 SND_BIN_OP (R, operator +, S, ND, mx_inline_add) \ | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
272 SND_BIN_OP (R, operator -, S, ND, mx_inline_sub) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
273 SND_BIN_OP (R, operator *, S, ND, mx_inline_mul) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
274 SND_BIN_OP (R, operator /, S, ND, mx_inline_div) |
4543 | 275 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
276 #define SND_CMP_OP(F, OP, S, ND) \ |
6119 | 277 boolNDArray \ |
278 F (const S& s, const ND& m) \ | |
279 { \ | |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
280 return do_sm_binary_op<bool, S, ND::element_type> (s, m, OP); \ |
6119 | 281 } |
282 | |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
283 #define SND_CMP_OPS(S, ND) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
284 SND_CMP_OP (mx_el_lt, mx_inline_lt, S, ND) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
285 SND_CMP_OP (mx_el_le, mx_inline_le, S, ND) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
286 SND_CMP_OP (mx_el_ge, mx_inline_ge, S, ND) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
287 SND_CMP_OP (mx_el_gt, mx_inline_gt, S, ND) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
288 SND_CMP_OP (mx_el_eq, mx_inline_eq, S, ND) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
289 SND_CMP_OP (mx_el_ne, mx_inline_ne, S, ND) |
6119 | 290 |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
291 #define SND_BOOL_OP(F, OP, S, ND) \ |
4543 | 292 boolNDArray \ |
293 F (const S& s, const ND& m) \ | |
294 { \ | |
10481
e8811e5dd699
avoid exception throwing in mx-inline loops
Jaroslav Hajek <highegg@gmail.com>
parents:
10362
diff
changeset
|
295 SNANCHK (s); \ |
10682
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
296 MNANCHK (m, ND::element_type); \ |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
297 return do_sm_binary_op<bool, S, ND::element_type> (s, m, OP); \ |
4543 | 298 } |
299 | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
300 #define SND_BOOL_OPS(S, ND) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
301 SND_BOOL_OP (mx_el_and, mx_inline_and, S, ND) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
302 SND_BOOL_OP (mx_el_or, mx_inline_or, S, ND) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
303 SND_BOOL_OP (mx_el_not_and, mx_inline_not_and, S, ND) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
304 SND_BOOL_OP (mx_el_not_or, mx_inline_not_or, S, ND) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
305 SND_BOOL_OP (mx_el_and_not, mx_inline_and_not, S, ND) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
306 SND_BOOL_OP (mx_el_or_not, mx_inline_or_not, S, ND) |
4543 | 307 |
308 // N-d matrix by N-d matrix operations. | |
309 | |
310 #define NDND_BIN_OP(R, OP, ND1, ND2, F) \ | |
311 R \ | |
312 OP (const ND1& m1, const ND2& m2) \ | |
313 { \ | |
13004
d9d65c3017c3
Make bsxfun automatic for most binary operators.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11523
diff
changeset
|
314 return do_mm_binary_op<R::element_type, ND1::element_type, ND2::element_type> (m1, m2, F, F, F, #OP); \ |
4543 | 315 } |
316 | |
317 #define NDND_BIN_OPS(R, ND1, ND2) \ | |
318 NDND_BIN_OP (R, operator +, ND1, ND2, mx_inline_add) \ | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
319 NDND_BIN_OP (R, operator -, ND1, ND2, mx_inline_sub) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
320 NDND_BIN_OP (R, product, ND1, ND2, mx_inline_mul) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
321 NDND_BIN_OP (R, quotient, ND1, ND2, mx_inline_div) |
4543 | 322 |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
323 #define NDND_CMP_OP(F, OP, ND1, ND2) \ |
4543 | 324 boolNDArray \ |
325 F (const ND1& m1, const ND2& m2) \ | |
326 { \ | |
13004
d9d65c3017c3
Make bsxfun automatic for most binary operators.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11523
diff
changeset
|
327 return do_mm_binary_op<bool, ND1::element_type, ND2::element_type> (m1, m2, OP, OP, OP, #F); \ |
4543 | 328 } |
329 | |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
330 #define NDND_CMP_OPS(ND1, ND2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
331 NDND_CMP_OP (mx_el_lt, mx_inline_lt, ND1, ND2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
332 NDND_CMP_OP (mx_el_le, mx_inline_le, ND1, ND2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
333 NDND_CMP_OP (mx_el_ge, mx_inline_ge, ND1, ND2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
334 NDND_CMP_OP (mx_el_gt, mx_inline_gt, ND1, ND2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
335 NDND_CMP_OP (mx_el_eq, mx_inline_eq, ND1, ND2) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9553
diff
changeset
|
336 NDND_CMP_OP (mx_el_ne, mx_inline_ne, ND1, ND2) |
4543 | 337 |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
338 #define NDND_BOOL_OP(F, OP, ND1, ND2) \ |
4543 | 339 boolNDArray \ |
340 F (const ND1& m1, const ND2& m2) \ | |
341 { \ | |
10682
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
342 MNANCHK (m1, ND1::element_type); \ |
7b4ffe27bbb4
Specify template arguments explicitely [MSVC].
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10521
diff
changeset
|
343 MNANCHK (m2, ND2::element_type); \ |
13004
d9d65c3017c3
Make bsxfun automatic for most binary operators.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11523
diff
changeset
|
344 return do_mm_binary_op<bool, ND1::element_type, ND2::element_type> (m1, m2, OP, OP, OP, #F); \ |
4543 | 345 } |
346 | |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
347 #define NDND_BOOL_OPS(ND1, ND2) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
348 NDND_BOOL_OP (mx_el_and, mx_inline_and, ND1, ND2) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
349 NDND_BOOL_OP (mx_el_or, mx_inline_or, ND1, ND2) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
350 NDND_BOOL_OP (mx_el_not_and, mx_inline_not_and, ND1, ND2) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
351 NDND_BOOL_OP (mx_el_not_or, mx_inline_not_or, ND1, ND2) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
352 NDND_BOOL_OP (mx_el_and_not, mx_inline_and_not, ND1, ND2) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
353 NDND_BOOL_OP (mx_el_or_not, mx_inline_or_not, ND1, ND2) |
4543 | 354 |
2870 | 355 // scalar by diagonal matrix operations. |
356 | |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
357 #define SDM_BIN_OP(R, OP, S, DM) \ |
2829 | 358 R \ |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
359 operator OP (const S& s, const DM& dm) \ |
2829 | 360 { \ |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
361 R r (dm.rows (), dm.cols ()); \ |
2829 | 362 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
363 for (octave_idx_type i = 0; i < dm.length (); i++) \ |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
364 r.dgxelem (i) = s OP dm.dgelem (i); \ |
2829 | 365 \ |
366 return r; \ | |
367 } | |
368 | |
2870 | 369 #define SDM_BIN_OPS(R, S, DM) \ |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
370 SDM_BIN_OP (R, *, S, DM) |
2870 | 371 |
372 // diagonal matrix by scalar operations. | |
373 | |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
374 #define DMS_BIN_OP(R, OP, DM, S) \ |
2829 | 375 R \ |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
376 operator OP (const DM& dm, const S& s) \ |
2829 | 377 { \ |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
378 R r (dm.rows (), dm.cols ()); \ |
2829 | 379 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
380 for (octave_idx_type i = 0; i < dm.length (); i++) \ |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
381 r.dgxelem (i) = dm.dgelem (i) OP s; \ |
2829 | 382 \ |
383 return r; \ | |
384 } | |
385 | |
2870 | 386 #define DMS_BIN_OPS(R, DM, S) \ |
9732
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
387 DMS_BIN_OP (R, *, DM, S) \ |
b4fdfee405b5
remove ArrayN<T> + fix nonhom. diag-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
9660
diff
changeset
|
388 DMS_BIN_OP (R, /, DM, S) |
2870 | 389 |
390 // matrix by diagonal matrix operations. | |
391 | |
392 #define MDM_BIN_OP(R, OP, M, DM, OPEQ) \ | |
2829 | 393 R \ |
394 OP (const M& m, const DM& dm) \ | |
395 { \ | |
396 R r; \ | |
397 \ | |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
398 octave_idx_type m_nr = m.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
399 octave_idx_type m_nc = m.cols (); \ |
2829 | 400 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
401 octave_idx_type dm_nr = dm.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
402 octave_idx_type dm_nc = dm.cols (); \ |
2829 | 403 \ |
404 if (m_nr != dm_nr || m_nc != dm_nc) \ | |
405 gripe_nonconformant (#OP, m_nr, m_nc, dm_nr, dm_nc); \ | |
406 else \ | |
407 { \ | |
408 r.resize (m_nr, m_nc); \ | |
409 \ | |
410 if (m_nr > 0 && m_nc > 0) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
411 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
412 r = R (m); \ |
2829 | 413 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
414 octave_idx_type len = dm.length (); \ |
2829 | 415 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
416 for (octave_idx_type i = 0; i < len; i++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14138
diff
changeset
|
417 r.elem (i, i) OPEQ dm.elem (i, i); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
418 } \ |
2829 | 419 } \ |
420 \ | |
421 return r; \ | |
422 } | |
423 | |
5030 | 424 #define MDM_MULTIPLY_OP(R, M, DM, R_ZERO) \ |
2829 | 425 R \ |
426 operator * (const M& m, const DM& dm) \ | |
427 { \ | |
428 R r; \ | |
429 \ | |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
430 octave_idx_type m_nr = m.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
431 octave_idx_type m_nc = m.cols (); \ |
2829 | 432 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
433 octave_idx_type dm_nr = dm.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
434 octave_idx_type dm_nc = dm.cols (); \ |
2829 | 435 \ |
436 if (m_nc != dm_nr) \ | |
437 gripe_nonconformant ("operator *", m_nr, m_nc, dm_nr, dm_nc); \ | |
438 else \ | |
439 { \ | |
8366
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7922
diff
changeset
|
440 r = R (m_nr, dm_nc); \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
441 R::element_type *rd = r.fortran_vec (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
442 const M::element_type *md = m.data (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
443 const DM::element_type *dd = dm.data (); \ |
4543 | 444 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
445 octave_idx_type len = dm.length (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
446 for (octave_idx_type i = 0; i < len; i++) \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
447 { \ |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
448 mx_inline_mul (m_nr, rd, md, dd[i]); \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
449 rd += m_nr; md += m_nr; \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
450 } \ |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
451 mx_inline_fill (m_nr * (dm_nc - len), rd, R_ZERO); \ |
2829 | 452 } \ |
453 \ | |
454 return r; \ | |
455 } | |
456 | |
5030 | 457 #define MDM_BIN_OPS(R, M, DM, R_ZERO) \ |
2870 | 458 MDM_BIN_OP (R, operator +, M, DM, +=) \ |
459 MDM_BIN_OP (R, operator -, M, DM, -=) \ | |
5030 | 460 MDM_MULTIPLY_OP (R, M, DM, R_ZERO) |
2829 | 461 |
2870 | 462 // diagonal matrix by matrix operations. |
463 | |
3585 | 464 #define DMM_BIN_OP(R, OP, DM, M, OPEQ, PREOP) \ |
2829 | 465 R \ |
466 OP (const DM& dm, const M& m) \ | |
467 { \ | |
468 R r; \ | |
469 \ | |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
470 octave_idx_type dm_nr = dm.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
471 octave_idx_type dm_nc = dm.cols (); \ |
2829 | 472 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
473 octave_idx_type m_nr = m.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
474 octave_idx_type m_nc = m.cols (); \ |
2829 | 475 \ |
476 if (dm_nr != m_nr || dm_nc != m_nc) \ | |
477 gripe_nonconformant (#OP, dm_nr, dm_nc, m_nr, m_nc); \ | |
478 else \ | |
479 { \ | |
480 if (m_nr > 0 && m_nc > 0) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
481 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
482 r = R (PREOP m); \ |
2829 | 483 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
484 octave_idx_type len = dm.length (); \ |
2829 | 485 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
486 for (octave_idx_type i = 0; i < len; i++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14138
diff
changeset
|
487 r.elem (i, i) OPEQ dm.elem (i, i); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
488 } \ |
2829 | 489 else \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
490 r.resize (m_nr, m_nc); \ |
2829 | 491 } \ |
492 \ | |
493 return r; \ | |
494 } | |
495 | |
5030 | 496 #define DMM_MULTIPLY_OP(R, DM, M, R_ZERO) \ |
2829 | 497 R \ |
498 operator * (const DM& dm, const M& m) \ | |
499 { \ | |
500 R r; \ | |
501 \ | |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
502 octave_idx_type dm_nr = dm.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
503 octave_idx_type dm_nc = dm.cols (); \ |
2829 | 504 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
505 octave_idx_type m_nr = m.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
506 octave_idx_type m_nc = m.cols (); \ |
2829 | 507 \ |
508 if (dm_nc != m_nr) \ | |
509 gripe_nonconformant ("operator *", dm_nr, dm_nc, m_nr, m_nc); \ | |
510 else \ | |
511 { \ | |
8366
8b1a2555c4e2
implement diagonal matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
7922
diff
changeset
|
512 r = R (dm_nr, m_nc); \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
513 R::element_type *rd = r.fortran_vec (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
514 const M::element_type *md = m.data (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
515 const DM::element_type *dd = dm.data (); \ |
4543 | 516 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
517 octave_idx_type len = dm.length (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
518 for (octave_idx_type i = 0; i < m_nc; i++) \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
519 { \ |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
520 mx_inline_mul (len, rd, md, dd); \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
521 rd += len; md += m_nr; \ |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
522 mx_inline_fill (dm_nr - len, rd, R_ZERO); \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
523 rd += dm_nr - len; \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
524 } \ |
2829 | 525 } \ |
526 \ | |
527 return r; \ | |
528 } | |
529 | |
5030 | 530 #define DMM_BIN_OPS(R, DM, M, R_ZERO) \ |
3585 | 531 DMM_BIN_OP (R, operator +, DM, M, +=, ) \ |
532 DMM_BIN_OP (R, operator -, DM, M, +=, -) \ | |
5030 | 533 DMM_MULTIPLY_OP (R, DM, M, R_ZERO) |
2829 | 534 |
2870 | 535 // diagonal matrix by diagonal matrix operations. |
2829 | 536 |
2870 | 537 #define DMDM_BIN_OP(R, OP, DM1, DM2, F) \ |
2829 | 538 R \ |
539 OP (const DM1& dm1, const DM2& dm2) \ | |
540 { \ | |
541 R r; \ | |
542 \ | |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
543 octave_idx_type dm1_nr = dm1.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
544 octave_idx_type dm1_nc = dm1.cols (); \ |
2829 | 545 \ |
8380
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
546 octave_idx_type dm2_nr = dm2.rows (); \ |
dbe67764e628
fix & improve speed of diagonal matrix multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
547 octave_idx_type dm2_nc = dm2.cols (); \ |
2829 | 548 \ |
549 if (dm1_nr != dm2_nr || dm1_nc != dm2_nc) \ | |
550 gripe_nonconformant (#OP, dm1_nr, dm1_nc, dm2_nr, dm2_nc); \ | |
551 else \ | |
552 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
553 r.resize (dm1_nr, dm1_nc); \ |
2829 | 554 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
555 if (dm1_nr > 0 && dm1_nc > 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
556 F (dm1.length (), r.fortran_vec (), dm1.data (), dm2.data ()); \ |
2829 | 557 } \ |
558 \ | |
559 return r; \ | |
560 } | |
561 | |
2870 | 562 #define DMDM_BIN_OPS(R, DM1, DM2) \ |
3769 | 563 DMDM_BIN_OP (R, operator +, DM1, DM2, mx_inline_add) \ |
9550
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
564 DMDM_BIN_OP (R, operator -, DM1, DM2, mx_inline_sub) \ |
3d6a9aea2aea
refactor binary & bool ops in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
8998
diff
changeset
|
565 DMDM_BIN_OP (R, product, DM1, DM2, mx_inline_mul) |
2870 | 566 |
8774
b756ce0002db
split implementation and interface in mx-op-defs and MArray-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
8397
diff
changeset
|
567 // scalar by N-d array min/max ops |
3582 | 568 |
10329
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
569 #define SND_MINMAX_FCN(FCN, OP, T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
570 T \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
571 FCN (S d, const T& m) \ |
7189 | 572 { \ |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
573 return do_sm_binary_op<T::element_type, S, T::element_type> (d, m, mx_inline_x##FCN); \ |
7189 | 574 } |
575 | |
10329
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
576 #define NDS_MINMAX_FCN(FCN, OP, T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
577 T \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
578 FCN (const T& m, S d) \ |
7189 | 579 { \ |
10362
b47ab50a6aa8
simplify appliers in mx-inlines.cc
Jaroslav Hajek <highegg@gmail.com>
parents:
10329
diff
changeset
|
580 return do_ms_binary_op<T::element_type, T::element_type, S> (m, d, mx_inline_x##FCN); \ |
7189 | 581 } |
582 | |
10329
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
583 #define NDND_MINMAX_FCN(FCN, OP, T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
584 T \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
585 FCN (const T& a, const T& b) \ |
7189 | 586 { \ |
13004
d9d65c3017c3
Make bsxfun automatic for most binary operators.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11523
diff
changeset
|
587 return do_mm_binary_op<T::element_type, T::element_type, T::element_type> (a, b, mx_inline_x##FCN, mx_inline_x##FCN, mx_inline_x##FCN, #FCN); \ |
7189 | 588 } |
589 | |
10329
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
590 #define MINMAX_FCNS(T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
591 SND_MINMAX_FCN (min, <, T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
592 NDS_MINMAX_FCN (min, <, T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
593 NDND_MINMAX_FCN (min, <, T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
594 SND_MINMAX_FCN (max, >, T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
595 NDS_MINMAX_FCN (max, >, T, S) \ |
83fa590b8a09
simplify min/max definitions in liboctave
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
596 NDND_MINMAX_FCN (max, >, T, S) |
7189 | 597 |
8774
b756ce0002db
split implementation and interface in mx-op-defs and MArray-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
8397
diff
changeset
|
598 // permutation matrix by matrix ops and vice versa |
7189 | 599 |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
600 #define PMM_MULTIPLY_OP(PM, M) \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
601 M operator * (const PM& p, const M& x) \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
602 { \ |
18084
8e056300994b
Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
603 octave_idx_type nr = x.rows (); \ |
8e056300994b
Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
604 octave_idx_type nc = x.columns (); \ |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
605 M result; \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
606 if (p.columns () != nr) \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
607 gripe_nonconformant ("operator *", p.rows (), p.columns (), nr, nc); \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
608 else \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
609 { \ |
19039
aa9ca67f09fb
make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents:
18084
diff
changeset
|
610 result = M (nr, nc); \ |
aa9ca67f09fb
make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents:
18084
diff
changeset
|
611 result.assign (p.col_perm_vec (), idx_vector::colon, x); \ |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
612 } \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
613 \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
614 return result; \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
615 } |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
616 |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
617 #define MPM_MULTIPLY_OP(M, PM) \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
618 M operator * (const M& x, const PM& p) \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
619 { \ |
18084
8e056300994b
Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
620 octave_idx_type nr = x.rows (); \ |
8e056300994b
Follow coding convention of defining and initializing only 1 variable per line in liboctave.
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
621 octave_idx_type nc = x.columns (); \ |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
622 M result; \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
623 if (p.rows () != nc) \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
624 gripe_nonconformant ("operator *", nr, nc, p.rows (), p.columns ()); \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
625 else \ |
19039
aa9ca67f09fb
make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents:
18084
diff
changeset
|
626 result = x.index (idx_vector::colon, p.col_perm_vec ()); \ |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
627 \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
628 return result; \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
629 } |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
630 |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
631 #define PMM_BIN_OPS(R, PM, M) \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
632 PMM_MULTIPLY_OP(PM, M); |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
633 |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
634 #define MPM_BIN_OPS(R, M, PM) \ |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
635 MPM_MULTIPLY_OP(M, PM); |
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8366
diff
changeset
|
636 |
8998
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8983
diff
changeset
|
637 #define NDND_MAPPER_BODY(R, NAME) \ |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8983
diff
changeset
|
638 R retval (dims ()); \ |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8983
diff
changeset
|
639 octave_idx_type n = numel (); \ |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8983
diff
changeset
|
640 for (octave_idx_type i = 0; i < n; i++) \ |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8983
diff
changeset
|
641 retval.xelem (i) = NAME (elem (i)); \ |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8983
diff
changeset
|
642 return retval; |
a48fba01e4ac
optimize isnan/isinf/isfinite mappers
Jaroslav Hajek <highegg@gmail.com>
parents:
8983
diff
changeset
|
643 |
8774
b756ce0002db
split implementation and interface in mx-op-defs and MArray-defs
Jaroslav Hajek <highegg@gmail.com>
parents:
8397
diff
changeset
|
644 #endif |