Mercurial > hg > octave-lyh
annotate liboctave/operators/Sparse-op-defs.h @ 17475:fd01c78caa0b
Added tag ss-3-7-7 for changeset cc13924a4266
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 23 Sep 2013 13:31:11 -0400 |
parents | 79d4b6089968 |
children |
rev | line source |
---|---|
5164 | 1 /* |
2 | |
14138
72c96de7a403
maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents:
13731
diff
changeset
|
3 Copyright (C) 2004-2012 David Bateman |
11523 | 4 Copyright (C) 1998-2004 Andy Adler |
7803 | 5 Copyright (C) 2008 Jaroslav Hajek |
7016 | 6 |
7 This file is part of Octave. | |
5164 | 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. | |
5164 | 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/>. | |
5164 | 22 |
23 */ | |
24 | |
25 #if !defined (octave_sparse_op_defs_h) | |
26 #define octave_sparse_op_defs_h 1 | |
27 | |
28 #include "Array-util.h" | |
6221 | 29 #include "mx-ops.h" |
8377
25bc2d31e1bf
improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
8198
diff
changeset
|
30 #include "oct-locbuf.h" |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
31 #include "mx-inlines.cc" |
5164 | 32 |
6708 | 33 #define SPARSE_BIN_OP_DECL(R, OP, X, Y, API) \ |
34 extern API R OP (const X&, const Y&) | |
5164 | 35 |
6708 | 36 #define SPARSE_CMP_OP_DECL(OP, X, Y, API) \ |
37 extern API SparseBoolMatrix OP (const X&, const Y&) | |
5164 | 38 |
6708 | 39 #define SPARSE_BOOL_OP_DECL(OP, X, Y, API) \ |
40 extern API SparseBoolMatrix OP (const X&, const Y&) | |
5164 | 41 |
42 // matrix by scalar operations. | |
43 | |
6708 | 44 #define SPARSE_SMS_BIN_OP_DECLS(R1, R2, M, S, API) \ |
45 SPARSE_BIN_OP_DECL (R1, operator +, M, S, API); \ | |
46 SPARSE_BIN_OP_DECL (R1, operator -, M, S, API); \ | |
47 SPARSE_BIN_OP_DECL (R2, operator *, M, S, API); \ | |
48 SPARSE_BIN_OP_DECL (R2, operator /, M, S, API); | |
5164 | 49 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
50 #define SPARSE_SMS_BIN_OP_1(R, F, OP, M, S) \ |
5164 | 51 R \ |
52 F (const M& m, const S& s) \ | |
53 { \ | |
5275 | 54 octave_idx_type nr = m.rows (); \ |
55 octave_idx_type nc = m.cols (); \ | |
5164 | 56 \ |
57 R r (nr, nc, (0.0 OP s)); \ | |
58 \ | |
5275 | 59 for (octave_idx_type j = 0; j < nc; j++) \ |
60 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
61 r.xelem (m.ridx (i), j) = m.data (i) OP s; \ |
5164 | 62 return r; \ |
63 } | |
64 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
65 #define SPARSE_SMS_BIN_OP_2(R, F, OP, M, S) \ |
5164 | 66 R \ |
67 F (const M& m, const S& s) \ | |
68 { \ | |
5275 | 69 octave_idx_type nr = m.rows (); \ |
70 octave_idx_type nc = m.cols (); \ | |
5681 | 71 octave_idx_type nz = m.nnz (); \ |
5164 | 72 \ |
73 R r (nr, nc, nz); \ | |
74 \ | |
5275 | 75 for (octave_idx_type i = 0; i < nz; i++) \ |
5164 | 76 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
77 r.xdata (i) = m.data (i) OP s; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
78 r.xridx (i) = m.ridx (i); \ |
5164 | 79 } \ |
5275 | 80 for (octave_idx_type i = 0; i < nc + 1; i++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
81 r.xcidx (i) = m.cidx (i); \ |
5164 | 82 \ |
83 r.maybe_compress (true); \ | |
84 return r; \ | |
85 } | |
86 | |
87 #define SPARSE_SMS_BIN_OPS(R1, R2, M, S) \ | |
88 SPARSE_SMS_BIN_OP_1 (R1, operator +, +, M, S) \ | |
89 SPARSE_SMS_BIN_OP_1 (R1, operator -, -, M, S) \ | |
90 SPARSE_SMS_BIN_OP_2 (R2, operator *, *, M, S) \ | |
91 SPARSE_SMS_BIN_OP_2 (R2, operator /, /, M, S) | |
92 | |
6708 | 93 #define SPARSE_SMS_CMP_OP_DECLS(M, S, API) \ |
94 SPARSE_CMP_OP_DECL (mx_el_lt, M, S, API); \ | |
95 SPARSE_CMP_OP_DECL (mx_el_le, M, S, API); \ | |
96 SPARSE_CMP_OP_DECL (mx_el_ge, M, S, API); \ | |
97 SPARSE_CMP_OP_DECL (mx_el_gt, M, S, API); \ | |
98 SPARSE_CMP_OP_DECL (mx_el_eq, M, S, API); \ | |
99 SPARSE_CMP_OP_DECL (mx_el_ne, M, S, API); | |
5164 | 100 |
6708 | 101 #define SPARSE_SMS_EQNE_OP_DECLS(M, S, API) \ |
102 SPARSE_CMP_OP_DECL (mx_el_eq, M, S, API); \ | |
103 SPARSE_CMP_OP_DECL (mx_el_ne, M, S, API); | |
5164 | 104 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
105 #define SPARSE_SMS_CMP_OP(F, OP, M, MZ, MC, S, SZ, SC) \ |
5164 | 106 SparseBoolMatrix \ |
107 F (const M& m, const S& s) \ | |
108 { \ | |
5275 | 109 octave_idx_type nr = m.rows (); \ |
110 octave_idx_type nc = m.cols (); \ | |
7269 | 111 SparseBoolMatrix r; \ |
5164 | 112 \ |
7269 | 113 if (MC (MZ) OP SC (s)) \ |
114 { \ | |
115 r = SparseBoolMatrix (nr, nc, true); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
116 for (octave_idx_type j = 0; j < nc; j++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
117 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ |
7269 | 118 if (! (MC (m.data (i)) OP SC (s))) \ |
119 r.data (m.ridx (i) + j * nr) = false; \ | |
120 r.maybe_compress (true); \ | |
121 } \ | |
122 else \ | |
5164 | 123 { \ |
7269 | 124 r = SparseBoolMatrix (nr, nc, m.nnz ()); \ |
125 r.cidx (0) = static_cast<octave_idx_type> (0); \ | |
126 octave_idx_type nel = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
127 for (octave_idx_type j = 0; j < nc; j++) \ |
7269 | 128 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
129 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ |
7269 | 130 if (MC (m.data (i)) OP SC (s)) \ |
131 { \ | |
132 r.ridx (nel) = m.ridx (i); \ | |
133 r.data (nel++) = true; \ | |
134 } \ | |
135 r.cidx (j + 1) = nel; \ | |
136 } \ | |
137 r.maybe_compress (false); \ | |
138 } \ | |
5164 | 139 return r; \ |
140 } | |
141 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
142 #define SPARSE_SMS_CMP_OPS(M, MZ, CM, S, SZ, CS) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
143 SPARSE_SMS_CMP_OP (mx_el_lt, <, M, MZ, , S, SZ, ) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
144 SPARSE_SMS_CMP_OP (mx_el_le, <=, M, MZ, , S, SZ, ) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
145 SPARSE_SMS_CMP_OP (mx_el_ge, >=, M, MZ, , S, SZ, ) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
146 SPARSE_SMS_CMP_OP (mx_el_gt, >, M, MZ, , S, SZ, ) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
147 SPARSE_SMS_CMP_OP (mx_el_eq, ==, M, MZ, , S, SZ, ) \ |
5164 | 148 SPARSE_SMS_CMP_OP (mx_el_ne, !=, M, MZ, , S, SZ, ) |
149 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
150 #define SPARSE_SMS_EQNE_OPS(M, MZ, CM, S, SZ, CS) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
151 SPARSE_SMS_CMP_OP (mx_el_eq, ==, M, MZ, , S, SZ, ) \ |
5164 | 152 SPARSE_SMS_CMP_OP (mx_el_ne, !=, M, MZ, , S, SZ, ) |
153 | |
6708 | 154 #define SPARSE_SMS_BOOL_OP_DECLS(M, S, API) \ |
155 SPARSE_BOOL_OP_DECL (mx_el_and, M, S, API); \ | |
156 SPARSE_BOOL_OP_DECL (mx_el_or, M, S, API); | |
5164 | 157 |
158 #define SPARSE_SMS_BOOL_OP(F, OP, M, S, LHS_ZERO, RHS_ZERO) \ | |
159 SparseBoolMatrix \ | |
160 F (const M& m, const S& s) \ | |
161 { \ | |
5275 | 162 octave_idx_type nr = m.rows (); \ |
163 octave_idx_type nc = m.cols (); \ | |
7269 | 164 SparseBoolMatrix r; \ |
5164 | 165 \ |
166 if (nr > 0 && nc > 0) \ | |
167 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
168 if (LHS_ZERO OP (s != RHS_ZERO)) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
169 { \ |
7269 | 170 r = SparseBoolMatrix (nr, nc, true); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
171 for (octave_idx_type j = 0; j < nc; j++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
172 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
173 if (! ((m.data (i) != LHS_ZERO) OP (s != RHS_ZERO))) \ |
7269 | 174 r.data (m.ridx (i) + j * nr) = false; \ |
175 r.maybe_compress (true); \ | |
176 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
177 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
178 { \ |
7269 | 179 r = SparseBoolMatrix (nr, nc, m.nnz ()); \ |
180 r.cidx (0) = static_cast<octave_idx_type> (0); \ | |
181 octave_idx_type nel = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
182 for (octave_idx_type j = 0; j < nc; j++) \ |
7269 | 183 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
184 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
185 if ((m.data (i) != LHS_ZERO) OP (s != RHS_ZERO)) \ |
7269 | 186 { \ |
187 r.ridx (nel) = m.ridx (i); \ | |
188 r.data (nel++) = true; \ | |
189 } \ | |
190 r.cidx (j + 1) = nel; \ | |
191 } \ | |
192 r.maybe_compress (false); \ | |
193 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
194 } \ |
5164 | 195 return r; \ |
196 } | |
197 | |
198 #define SPARSE_SMS_BOOL_OPS2(M, S, LHS_ZERO, RHS_ZERO) \ | |
199 SPARSE_SMS_BOOL_OP (mx_el_and, &&, M, S, LHS_ZERO, RHS_ZERO) \ | |
200 SPARSE_SMS_BOOL_OP (mx_el_or, ||, M, S, LHS_ZERO, RHS_ZERO) | |
201 | |
202 #define SPARSE_SMS_BOOL_OPS(M, S, ZERO) \ | |
203 SPARSE_SMS_BOOL_OPS2(M, S, ZERO, ZERO) | |
204 | |
6708 | 205 #define SPARSE_SMS_OP_DECLS(R1, R2, M, S, API) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
206 SPARSE_SMS_BIN_OP_DECLS (R1, R2, M, S, API) \ |
6708 | 207 SPARSE_SMS_CMP_OP_DECLS (M, S, API) \ |
208 SPARSE_SMS_BOOL_OP_DECLS (M, S, API) | |
5164 | 209 |
210 // scalar by matrix operations. | |
211 | |
6708 | 212 #define SPARSE_SSM_BIN_OP_DECLS(R1, R2, S, M, API) \ |
213 SPARSE_BIN_OP_DECL (R1, operator +, S, M, API); \ | |
214 SPARSE_BIN_OP_DECL (R1, operator -, S, M, API); \ | |
215 SPARSE_BIN_OP_DECL (R2, operator *, S, M, API); \ | |
216 SPARSE_BIN_OP_DECL (R2, operator /, S, M, API); | |
5164 | 217 |
218 #define SPARSE_SSM_BIN_OP_1(R, F, OP, S, M) \ | |
219 R \ | |
220 F (const S& s, const M& m) \ | |
221 { \ | |
5275 | 222 octave_idx_type nr = m.rows (); \ |
223 octave_idx_type nc = m.cols (); \ | |
5164 | 224 \ |
225 R r (nr, nc, (s OP 0.0)); \ | |
226 \ | |
5275 | 227 for (octave_idx_type j = 0; j < nc; j++) \ |
228 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
229 r.xelem (m.ridx (i), j) = s OP m.data (i); \ |
5164 | 230 \ |
231 return r; \ | |
232 } | |
233 | |
234 #define SPARSE_SSM_BIN_OP_2(R, F, OP, S, M) \ | |
235 R \ | |
236 F (const S& s, const M& m) \ | |
237 { \ | |
5275 | 238 octave_idx_type nr = m.rows (); \ |
239 octave_idx_type nc = m.cols (); \ | |
5681 | 240 octave_idx_type nz = m.nnz (); \ |
5164 | 241 \ |
242 R r (nr, nc, nz); \ | |
243 \ | |
5275 | 244 for (octave_idx_type i = 0; i < nz; i++) \ |
5164 | 245 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
246 r.xdata (i) = s OP m.data (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
247 r.xridx (i) = m.ridx (i); \ |
5164 | 248 } \ |
5275 | 249 for (octave_idx_type i = 0; i < nc + 1; i++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
250 r.xcidx (i) = m.cidx (i); \ |
5164 | 251 \ |
252 r.maybe_compress(true); \ | |
253 return r; \ | |
254 } | |
255 | |
256 #define SPARSE_SSM_BIN_OPS(R1, R2, S, M) \ | |
257 SPARSE_SSM_BIN_OP_1 (R1, operator +, +, S, M) \ | |
258 SPARSE_SSM_BIN_OP_1 (R1, operator -, -, S, M) \ | |
259 SPARSE_SSM_BIN_OP_2 (R2, operator *, *, S, M) \ | |
260 SPARSE_SSM_BIN_OP_2 (R2, operator /, /, S, M) | |
261 | |
6708 | 262 #define SPARSE_SSM_CMP_OP_DECLS(S, M, API) \ |
263 SPARSE_CMP_OP_DECL (mx_el_lt, S, M, API); \ | |
264 SPARSE_CMP_OP_DECL (mx_el_le, S, M, API); \ | |
265 SPARSE_CMP_OP_DECL (mx_el_ge, S, M, API); \ | |
266 SPARSE_CMP_OP_DECL (mx_el_gt, S, M, API); \ | |
267 SPARSE_CMP_OP_DECL (mx_el_eq, S, M, API); \ | |
268 SPARSE_CMP_OP_DECL (mx_el_ne, S, M, API); | |
5164 | 269 |
6708 | 270 #define SPARSE_SSM_EQNE_OP_DECLS(S, M, API) \ |
271 SPARSE_CMP_OP_DECL (mx_el_eq, S, M, API); \ | |
272 SPARSE_CMP_OP_DECL (mx_el_ne, S, M, API); | |
5164 | 273 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
274 #define SPARSE_SSM_CMP_OP(F, OP, S, SZ, SC, M, MZ, MC) \ |
5164 | 275 SparseBoolMatrix \ |
276 F (const S& s, const M& m) \ | |
277 { \ | |
5275 | 278 octave_idx_type nr = m.rows (); \ |
279 octave_idx_type nc = m.cols (); \ | |
7269 | 280 SparseBoolMatrix r; \ |
5164 | 281 \ |
7269 | 282 if (SC (s) OP SC (MZ)) \ |
283 { \ | |
284 r = SparseBoolMatrix (nr, nc, true); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
285 for (octave_idx_type j = 0; j < nc; j++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
286 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ |
7269 | 287 if (! (SC (s) OP MC (m.data (i)))) \ |
288 r.data (m.ridx (i) + j * nr) = false; \ | |
289 r.maybe_compress (true); \ | |
290 } \ | |
291 else \ | |
5164 | 292 { \ |
7269 | 293 r = SparseBoolMatrix (nr, nc, m.nnz ()); \ |
294 r.cidx (0) = static_cast<octave_idx_type> (0); \ | |
295 octave_idx_type nel = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
296 for (octave_idx_type j = 0; j < nc; j++) \ |
7269 | 297 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
298 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ |
7269 | 299 if (SC (s) OP MC (m.data (i))) \ |
300 { \ | |
301 r.ridx (nel) = m.ridx (i); \ | |
302 r.data (nel++) = true; \ | |
303 } \ | |
304 r.cidx (j + 1) = nel; \ | |
305 } \ | |
306 r.maybe_compress (false); \ | |
307 } \ | |
5164 | 308 return r; \ |
309 } | |
310 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
311 #define SPARSE_SSM_CMP_OPS(S, SZ, SC, M, MZ, MC) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
312 SPARSE_SSM_CMP_OP (mx_el_lt, <, S, SZ, , M, MZ, ) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
313 SPARSE_SSM_CMP_OP (mx_el_le, <=, S, SZ, , M, MZ, ) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
314 SPARSE_SSM_CMP_OP (mx_el_ge, >=, S, SZ, , M, MZ, ) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
315 SPARSE_SSM_CMP_OP (mx_el_gt, >, S, SZ, , M, MZ, ) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
316 SPARSE_SSM_CMP_OP (mx_el_eq, ==, S, SZ, , M, MZ, ) \ |
5164 | 317 SPARSE_SSM_CMP_OP (mx_el_ne, !=, S, SZ, , M, MZ, ) |
318 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
319 #define SPARSE_SSM_EQNE_OPS(S, SZ, SC, M, MZ, MC) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
320 SPARSE_SSM_CMP_OP (mx_el_eq, ==, S, SZ, , M, MZ, ) \ |
5164 | 321 SPARSE_SSM_CMP_OP (mx_el_ne, !=, S, SZ, , M, MZ, ) |
322 | |
6708 | 323 #define SPARSE_SSM_BOOL_OP_DECLS(S, M, API) \ |
324 SPARSE_BOOL_OP_DECL (mx_el_and, S, M, API); \ | |
325 SPARSE_BOOL_OP_DECL (mx_el_or, S, M, API); \ | |
5164 | 326 |
327 #define SPARSE_SSM_BOOL_OP(F, OP, S, M, LHS_ZERO, RHS_ZERO) \ | |
328 SparseBoolMatrix \ | |
329 F (const S& s, const M& m) \ | |
330 { \ | |
5275 | 331 octave_idx_type nr = m.rows (); \ |
332 octave_idx_type nc = m.cols (); \ | |
7269 | 333 SparseBoolMatrix r; \ |
5164 | 334 \ |
335 if (nr > 0 && nc > 0) \ | |
336 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
337 if ((s != LHS_ZERO) OP RHS_ZERO) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
338 { \ |
7269 | 339 r = SparseBoolMatrix (nr, nc, true); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
340 for (octave_idx_type j = 0; j < nc; j++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
341 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
342 if (! ((s != LHS_ZERO) OP (m.data (i) != RHS_ZERO))) \ |
7269 | 343 r.data (m.ridx (i) + j * nr) = false; \ |
344 r.maybe_compress (true); \ | |
345 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
346 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
347 { \ |
7269 | 348 r = SparseBoolMatrix (nr, nc, m.nnz ()); \ |
349 r.cidx (0) = static_cast<octave_idx_type> (0); \ | |
350 octave_idx_type nel = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
351 for (octave_idx_type j = 0; j < nc; j++) \ |
7269 | 352 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
353 for (octave_idx_type i = m.cidx (j); i < m.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
354 if ((s != LHS_ZERO) OP (m.data (i) != RHS_ZERO)) \ |
7269 | 355 { \ |
356 r.ridx (nel) = m.ridx (i); \ | |
357 r.data (nel++) = true; \ | |
358 } \ | |
359 r.cidx (j + 1) = nel; \ | |
360 } \ | |
361 r.maybe_compress (false); \ | |
362 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
363 } \ |
5164 | 364 return r; \ |
365 } | |
366 | |
367 #define SPARSE_SSM_BOOL_OPS2(S, M, LHS_ZERO, RHS_ZERO) \ | |
368 SPARSE_SSM_BOOL_OP (mx_el_and, &&, S, M, LHS_ZERO, RHS_ZERO) \ | |
369 SPARSE_SSM_BOOL_OP (mx_el_or, ||, S, M, LHS_ZERO, RHS_ZERO) | |
370 | |
371 #define SPARSE_SSM_BOOL_OPS(S, M, ZERO) \ | |
372 SPARSE_SSM_BOOL_OPS2(S, M, ZERO, ZERO) | |
373 | |
6708 | 374 #define SPARSE_SSM_OP_DECLS(R1, R2, S, M, API) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
375 SPARSE_SSM_BIN_OP_DECLS (R1, R2, S, M, API) \ |
6708 | 376 SPARSE_SSM_CMP_OP_DECLS (S, M, API) \ |
377 SPARSE_SSM_BOOL_OP_DECLS (S, M, API) \ | |
5164 | 378 |
379 // matrix by matrix operations. | |
380 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
381 #define SPARSE_SMSM_BIN_OP_DECLS(R1, R2, M1, M2, API) \ |
6708 | 382 SPARSE_BIN_OP_DECL (R1, operator +, M1, M2, API); \ |
383 SPARSE_BIN_OP_DECL (R1, operator -, M1, M2, API); \ | |
384 SPARSE_BIN_OP_DECL (R2, product, M1, M2, API); \ | |
385 SPARSE_BIN_OP_DECL (R2, quotient, M1, M2, API); | |
5164 | 386 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
387 #define SPARSE_SMSM_BIN_OP_1(R, F, OP, M1, M2) \ |
5164 | 388 R \ |
389 F (const M1& m1, const M2& m2) \ | |
390 { \ | |
391 R r; \ | |
392 \ | |
5275 | 393 octave_idx_type m1_nr = m1.rows (); \ |
394 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 395 \ |
5275 | 396 octave_idx_type m2_nr = m2.rows (); \ |
397 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 398 \ |
6221 | 399 if (m1_nr == 1 && m1_nc == 1) \ |
400 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
401 if (m1.elem (0,0) == 0.) \ |
7342 | 402 r = OP R (m2); \ |
6221 | 403 else \ |
404 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
405 r = R (m2_nr, m2_nc, m1.data (0) OP 0.); \ |
6221 | 406 \ |
407 for (octave_idx_type j = 0 ; j < m2_nc ; j++) \ | |
408 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
409 octave_quit (); \ |
6221 | 410 octave_idx_type idxj = j * m2_nr; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
411 for (octave_idx_type i = m2.cidx (j) ; i < m2.cidx (j+1) ; i++) \ |
6221 | 412 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
413 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
414 r.data (idxj + m2.ridx (i)) = m1.data (0) OP m2.data (i); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
415 } \ |
6221 | 416 } \ |
417 r.maybe_compress (); \ | |
418 } \ | |
419 } \ | |
420 else if (m2_nr == 1 && m2_nc == 1) \ | |
421 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
422 if (m2.elem (0,0) == 0.) \ |
6221 | 423 r = R (m1); \ |
424 else \ | |
425 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
426 r = R (m1_nr, m1_nc, 0. OP m2.data (0)); \ |
6221 | 427 \ |
428 for (octave_idx_type j = 0 ; j < m1_nc ; j++) \ | |
429 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
430 octave_quit (); \ |
6221 | 431 octave_idx_type idxj = j * m1_nr; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
432 for (octave_idx_type i = m1.cidx (j) ; i < m1.cidx (j+1) ; i++) \ |
6221 | 433 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
434 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
435 r.data (idxj + m1.ridx (i)) = m1.data (i) OP m2.data (0); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
436 } \ |
6221 | 437 } \ |
438 r.maybe_compress (); \ | |
439 } \ | |
440 } \ | |
441 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ | |
5164 | 442 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
443 else \ | |
444 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
445 r = R (m1_nr, m1_nc, (m1.nnz () + m2.nnz ())); \ |
5164 | 446 \ |
5275 | 447 octave_idx_type jx = 0; \ |
5164 | 448 r.cidx (0) = 0; \ |
5275 | 449 for (octave_idx_type i = 0 ; i < m1_nc ; i++) \ |
5164 | 450 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
451 octave_idx_type ja = m1.cidx (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
452 octave_idx_type ja_max = m1.cidx (i+1); \ |
5164 | 453 bool ja_lt_max= ja < ja_max; \ |
454 \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
455 octave_idx_type jb = m2.cidx (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
456 octave_idx_type jb_max = m2.cidx (i+1); \ |
5164 | 457 bool jb_lt_max = jb < jb_max; \ |
458 \ | |
459 while (ja_lt_max || jb_lt_max ) \ | |
460 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
461 octave_quit (); \ |
5164 | 462 if ((! jb_lt_max) || \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
463 (ja_lt_max && (m1.ridx (ja) < m2.ridx (jb)))) \ |
5164 | 464 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
465 r.ridx (jx) = m1.ridx (ja); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
466 r.data (jx) = m1.data (ja) OP 0.; \ |
5164 | 467 jx++; \ |
468 ja++; \ | |
469 ja_lt_max= ja < ja_max; \ | |
470 } \ | |
471 else if (( !ja_lt_max ) || \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
472 (jb_lt_max && (m2.ridx (jb) < m1.ridx (ja)) ) ) \ |
5164 | 473 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
474 r.ridx (jx) = m2.ridx (jb); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
475 r.data (jx) = 0. OP m2.data (jb); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
476 jx++; \ |
5164 | 477 jb++; \ |
478 jb_lt_max= jb < jb_max; \ | |
479 } \ | |
480 else \ | |
481 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
482 if ((m1.data (ja) OP m2.data (jb)) != 0.) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
483 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
484 r.data (jx) = m1.data (ja) OP m2.data (jb); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
485 r.ridx (jx) = m1.ridx (ja); \ |
5164 | 486 jx++; \ |
487 } \ | |
488 ja++; \ | |
489 ja_lt_max= ja < ja_max; \ | |
490 jb++; \ | |
491 jb_lt_max= jb < jb_max; \ | |
492 } \ | |
493 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
494 r.cidx (i+1) = jx; \ |
5164 | 495 } \ |
496 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
497 r.maybe_compress (); \ |
5164 | 498 } \ |
499 \ | |
500 return r; \ | |
501 } | |
502 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
503 #define SPARSE_SMSM_BIN_OP_2(R, F, OP, M1, M2) \ |
5164 | 504 R \ |
505 F (const M1& m1, const M2& m2) \ | |
506 { \ | |
507 R r; \ | |
508 \ | |
5275 | 509 octave_idx_type m1_nr = m1.rows (); \ |
510 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 511 \ |
5275 | 512 octave_idx_type m2_nr = m2.rows (); \ |
513 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 514 \ |
6221 | 515 if (m1_nr == 1 && m1_nc == 1) \ |
516 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
517 if (m1.elem (0,0) == 0.) \ |
6221 | 518 r = R (m2_nr, m2_nc); \ |
519 else \ | |
520 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
521 r = R (m2); \ |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
522 octave_idx_type m2_nnz = m2.nnz (); \ |
6221 | 523 \ |
524 for (octave_idx_type i = 0 ; i < m2_nnz ; i++) \ | |
525 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
526 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
527 r.data (i) = m1.data (0) OP r.data (i); \ |
6221 | 528 } \ |
529 r.maybe_compress (); \ | |
530 } \ | |
531 } \ | |
532 else if (m2_nr == 1 && m2_nc == 1) \ | |
533 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
534 if (m2.elem (0,0) == 0.) \ |
6221 | 535 r = R (m1_nr, m1_nc); \ |
536 else \ | |
537 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
538 r = R (m1); \ |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
539 octave_idx_type m1_nnz = m1.nnz (); \ |
6221 | 540 \ |
541 for (octave_idx_type i = 0 ; i < m1_nnz ; i++) \ | |
542 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
543 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
544 r.data (i) = r.data (i) OP m2.data (0); \ |
6221 | 545 } \ |
546 r.maybe_compress (); \ | |
547 } \ | |
548 } \ | |
549 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ | |
5164 | 550 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
551 else \ | |
552 { \ | |
5681 | 553 r = R (m1_nr, m1_nc, (m1.nnz () > m2.nnz () ? m1.nnz () : m2.nnz ())); \ |
5164 | 554 \ |
5275 | 555 octave_idx_type jx = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
556 r.cidx (0) = 0; \ |
5275 | 557 for (octave_idx_type i = 0 ; i < m1_nc ; i++) \ |
5164 | 558 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
559 octave_idx_type ja = m1.cidx (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
560 octave_idx_type ja_max = m1.cidx (i+1); \ |
5164 | 561 bool ja_lt_max= ja < ja_max; \ |
562 \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
563 octave_idx_type jb = m2.cidx (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
564 octave_idx_type jb_max = m2.cidx (i+1); \ |
5164 | 565 bool jb_lt_max = jb < jb_max; \ |
566 \ | |
567 while (ja_lt_max || jb_lt_max ) \ | |
568 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
569 octave_quit (); \ |
5164 | 570 if ((! jb_lt_max) || \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
571 (ja_lt_max && (m1.ridx (ja) < m2.ridx (jb)))) \ |
5164 | 572 { \ |
573 ja++; ja_lt_max= ja < ja_max; \ | |
574 } \ | |
575 else if (( !ja_lt_max ) || \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
576 (jb_lt_max && (m2.ridx (jb) < m1.ridx (ja)) ) ) \ |
5164 | 577 { \ |
578 jb++; jb_lt_max= jb < jb_max; \ | |
579 } \ | |
580 else \ | |
581 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
582 if ((m1.data (ja) OP m2.data (jb)) != 0.) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
583 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
584 r.data (jx) = m1.data (ja) OP m2.data (jb); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
585 r.ridx (jx) = m1.ridx (ja); \ |
5164 | 586 jx++; \ |
587 } \ | |
588 ja++; ja_lt_max= ja < ja_max; \ | |
589 jb++; jb_lt_max= jb < jb_max; \ | |
590 } \ | |
591 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
592 r.cidx (i+1) = jx; \ |
5164 | 593 } \ |
594 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
595 r.maybe_compress (); \ |
5164 | 596 } \ |
597 \ | |
598 return r; \ | |
599 } | |
600 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
601 #define SPARSE_SMSM_BIN_OP_3(R, F, OP, M1, M2) \ |
5164 | 602 R \ |
603 F (const M1& m1, const M2& m2) \ | |
604 { \ | |
605 R r; \ | |
606 \ | |
5275 | 607 octave_idx_type m1_nr = m1.rows (); \ |
608 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 609 \ |
5275 | 610 octave_idx_type m2_nr = m2.rows (); \ |
611 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 612 \ |
6221 | 613 if (m1_nr == 1 && m1_nc == 1) \ |
614 { \ | |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
615 if ((m1.elem (0,0) OP Complex ()) == Complex ()) \ |
6221 | 616 { \ |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
617 octave_idx_type m2_nnz = m2.nnz (); \ |
6221 | 618 r = R (m2); \ |
619 for (octave_idx_type i = 0 ; i < m2_nnz ; i++) \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
620 r.data (i) = m1.elem (0,0) OP r.data (i); \ |
6221 | 621 r.maybe_compress (); \ |
622 } \ | |
623 else \ | |
624 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
625 r = R (m2_nr, m2_nc, m1.elem (0,0) OP Complex ()); \ |
6221 | 626 for (octave_idx_type j = 0 ; j < m2_nc ; j++) \ |
627 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
628 octave_quit (); \ |
6221 | 629 octave_idx_type idxj = j * m2_nr; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
630 for (octave_idx_type i = m2.cidx (j) ; i < m2.cidx (j+1) ; i++) \ |
6221 | 631 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
632 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
633 r.data (idxj + m2.ridx (i)) = m1.elem (0,0) OP m2.data (i); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
634 } \ |
6221 | 635 } \ |
636 r.maybe_compress (); \ | |
637 } \ | |
638 } \ | |
639 else if (m2_nr == 1 && m2_nc == 1) \ | |
640 { \ | |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
641 if ((Complex () OP m1.elem (0,0)) == Complex ()) \ |
6221 | 642 { \ |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
643 octave_idx_type m1_nnz = m1.nnz (); \ |
6221 | 644 r = R (m1); \ |
645 for (octave_idx_type i = 0 ; i < m1_nnz ; i++) \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
646 r.data (i) = r.data (i) OP m2.elem (0,0); \ |
6221 | 647 r.maybe_compress (); \ |
648 } \ | |
649 else \ | |
650 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
651 r = R (m1_nr, m1_nc, Complex () OP m2.elem (0,0)); \ |
6221 | 652 for (octave_idx_type j = 0 ; j < m1_nc ; j++) \ |
653 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
654 octave_quit (); \ |
6221 | 655 octave_idx_type idxj = j * m1_nr; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
656 for (octave_idx_type i = m1.cidx (j) ; i < m1.cidx (j+1) ; i++) \ |
6221 | 657 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
658 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
659 r.data (idxj + m1.ridx (i)) = m1.data (i) OP m2.elem (0,0); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
660 } \ |
6221 | 661 } \ |
662 r.maybe_compress (); \ | |
663 } \ | |
664 } \ | |
665 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ | |
5164 | 666 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
667 else \ | |
668 { \ | |
669 \ | |
5775 | 670 /* FIXME Kludge... Always double/Complex, so Complex () */ \ |
5164 | 671 r = R (m1_nr, m1_nc, (Complex () OP Complex ())); \ |
672 \ | |
5275 | 673 for (octave_idx_type i = 0 ; i < m1_nc ; i++) \ |
5164 | 674 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
675 octave_idx_type ja = m1.cidx (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
676 octave_idx_type ja_max = m1.cidx (i+1); \ |
5164 | 677 bool ja_lt_max= ja < ja_max; \ |
678 \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
679 octave_idx_type jb = m2.cidx (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
680 octave_idx_type jb_max = m2.cidx (i+1); \ |
5164 | 681 bool jb_lt_max = jb < jb_max; \ |
682 \ | |
683 while (ja_lt_max || jb_lt_max ) \ | |
684 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
685 octave_quit (); \ |
5164 | 686 if ((! jb_lt_max) || \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
687 (ja_lt_max && (m1.ridx (ja) < m2.ridx (jb)))) \ |
5164 | 688 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
689 /* keep those kludges coming */ \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
690 r.elem (m1.ridx (ja),i) = m1.data (ja) OP Complex (); \ |
5164 | 691 ja++; \ |
692 ja_lt_max= ja < ja_max; \ | |
693 } \ | |
694 else if (( !ja_lt_max ) || \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
695 (jb_lt_max && (m2.ridx (jb) < m1.ridx (ja)) ) ) \ |
5164 | 696 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
697 /* keep those kludges coming */ \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
698 r.elem (m2.ridx (jb),i) = Complex () OP m2.data (jb); \ |
5164 | 699 jb++; \ |
700 jb_lt_max= jb < jb_max; \ | |
701 } \ | |
702 else \ | |
703 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
704 r.elem (m1.ridx (ja),i) = m1.data (ja) OP m2.data (jb); \ |
5164 | 705 ja++; \ |
706 ja_lt_max= ja < ja_max; \ | |
707 jb++; \ | |
708 jb_lt_max= jb < jb_max; \ | |
709 } \ | |
710 } \ | |
711 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
712 r.maybe_compress (true); \ |
5164 | 713 } \ |
714 \ | |
715 return r; \ | |
716 } | |
717 | |
718 // Note that SM ./ SM needs to take into account the NaN and Inf values | |
719 // implied by the division by zero. | |
5775 | 720 // FIXME Are the NaNs double(NaN) or Complex(NaN,Nan) in the complex |
5164 | 721 // case? |
722 #define SPARSE_SMSM_BIN_OPS(R1, R2, M1, M2) \ | |
723 SPARSE_SMSM_BIN_OP_1 (R1, operator +, +, M1, M2) \ | |
724 SPARSE_SMSM_BIN_OP_1 (R1, operator -, -, M1, M2) \ | |
725 SPARSE_SMSM_BIN_OP_2 (R2, product, *, M1, M2) \ | |
726 SPARSE_SMSM_BIN_OP_3 (R2, quotient, /, M1, M2) | |
727 | |
6708 | 728 #define SPARSE_SMSM_CMP_OP_DECLS(M1, M2, API) \ |
729 SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2, API); \ | |
730 SPARSE_CMP_OP_DECL (mx_el_le, M1, M2, API); \ | |
731 SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2, API); \ | |
732 SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2, API); \ | |
733 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
734 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 735 |
6708 | 736 #define SPARSE_SMSM_EQNE_OP_DECLS(M1, M2, API) \ |
737 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
738 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 739 |
8198 | 740 // FIXME -- this macro duplicatest the bodies of the template |
741 // functions defined in the SPARSE_SSM_CMP_OP and SPARSE_SMS_CMP_OP | |
742 // macros. | |
743 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
744 #define SPARSE_SMSM_CMP_OP(F, OP, M1, Z1, C1, M2, Z2, C2) \ |
5164 | 745 SparseBoolMatrix \ |
746 F (const M1& m1, const M2& m2) \ | |
747 { \ | |
748 SparseBoolMatrix r; \ | |
749 \ | |
5275 | 750 octave_idx_type m1_nr = m1.rows (); \ |
751 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 752 \ |
5275 | 753 octave_idx_type m2_nr = m2.rows (); \ |
754 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 755 \ |
6221 | 756 if (m1_nr == 1 && m1_nc == 1) \ |
757 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
758 if (C1 (m1.elem (0,0)) OP C2 (Z2)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
759 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
760 r = SparseBoolMatrix (m2_nr, m2_nc, true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
761 for (octave_idx_type j = 0; j < m2_nc; j++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
762 for (octave_idx_type i = m2.cidx (j); i < m2.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
763 if (! (C1 (m1.elem (0,0)) OP C2 (m2.data (i)))) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
764 r.data (m2.ridx (i) + j * m2_nr) = false; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
765 r.maybe_compress (true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
766 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
767 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
768 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
769 r = SparseBoolMatrix (m2_nr, m2_nc, m2.nnz ()); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
770 r.cidx (0) = static_cast<octave_idx_type> (0); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
771 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
772 for (octave_idx_type j = 0; j < m2_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
773 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
774 for (octave_idx_type i = m2.cidx (j); i < m2.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
775 if (C1 (m1.elem (0,0)) OP C2 (m2.data (i))) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
776 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
777 r.ridx (nel) = m2.ridx (i); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
778 r.data (nel++) = true; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
779 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
780 r.cidx (j + 1) = nel; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
781 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
782 r.maybe_compress (false); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
783 } \ |
6221 | 784 } \ |
785 else if (m2_nr == 1 && m2_nc == 1) \ | |
786 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
787 if (C1 (Z1) OP C2 (m2.elem (0,0))) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
788 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
789 r = SparseBoolMatrix (m1_nr, m1_nc, true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
790 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
791 for (octave_idx_type i = m1.cidx (j); i < m1.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
792 if (! (C1 (m1.data (i)) OP C2 (m2.elem (0,0)))) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
793 r.data (m1.ridx (i) + j * m1_nr) = false; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
794 r.maybe_compress (true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
795 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
796 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
797 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
798 r = SparseBoolMatrix (m1_nr, m1_nc, m1.nnz ()); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
799 r.cidx (0) = static_cast<octave_idx_type> (0); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
800 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
801 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
802 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
803 for (octave_idx_type i = m1.cidx (j); i < m1.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
804 if (C1 (m1.data (i)) OP C2 (m2.elem (0,0))) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
805 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
806 r.ridx (nel) = m1.ridx (i); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
807 r.data (nel++) = true; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
808 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
809 r.cidx (j + 1) = nel; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
810 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
811 r.maybe_compress (false); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
812 } \ |
6221 | 813 } \ |
814 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ | |
5164 | 815 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
816 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
817 { \ |
7269 | 818 if (C1 (Z1) OP C2 (Z2)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
819 { \ |
7269 | 820 r = SparseBoolMatrix (m1_nr, m1_nc, true); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
821 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
7269 | 822 { \ |
823 octave_idx_type i1 = m1.cidx (j); \ | |
824 octave_idx_type e1 = m1.cidx (j+1); \ | |
825 octave_idx_type i2 = m2.cidx (j); \ | |
826 octave_idx_type e2 = m2.cidx (j+1); \ | |
827 while (i1 < e1 || i2 < e2) \ | |
828 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
829 if (i1 == e1 || (i2 < e2 && m1.ridx (i1) > m2.ridx (i2))) \ |
7269 | 830 { \ |
831 if (! (C1 (Z1) OP C2 (m2.data (i2)))) \ | |
832 r.data (m2.ridx (i2) + j * m1_nr) = false; \ | |
833 i2++; \ | |
834 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
835 else if (i2 == e2 || m1.ridx (i1) < m2.ridx (i2)) \ |
7269 | 836 { \ |
837 if (! (C1 (m1.data (i1)) OP C2 (Z2))) \ | |
838 r.data (m1.ridx (i1) + j * m1_nr) = false; \ | |
839 i1++; \ | |
840 } \ | |
841 else \ | |
842 { \ | |
843 if (! (C1 (m1.data (i1)) OP C2 (m2.data (i2)))) \ | |
844 r.data (m1.ridx (i1) + j * m1_nr) = false; \ | |
845 i1++; \ | |
846 i2++; \ | |
847 } \ | |
848 } \ | |
849 } \ | |
850 r.maybe_compress (true); \ | |
851 } \ | |
852 else \ | |
853 { \ | |
854 r = SparseBoolMatrix (m1_nr, m1_nc, m1.nnz () + m2.nnz ()); \ | |
855 r.cidx (0) = static_cast<octave_idx_type> (0); \ | |
856 octave_idx_type nel = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
857 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
7269 | 858 { \ |
859 octave_idx_type i1 = m1.cidx (j); \ | |
860 octave_idx_type e1 = m1.cidx (j+1); \ | |
861 octave_idx_type i2 = m2.cidx (j); \ | |
862 octave_idx_type e2 = m2.cidx (j+1); \ | |
863 while (i1 < e1 || i2 < e2) \ | |
864 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
865 if (i1 == e1 || (i2 < e2 && m1.ridx (i1) > m2.ridx (i2))) \ |
7269 | 866 { \ |
867 if (C1 (Z1) OP C2 (m2.data (i2))) \ | |
868 { \ | |
869 r.ridx (nel) = m2.ridx (i2); \ | |
870 r.data (nel++) = true; \ | |
871 } \ | |
872 i2++; \ | |
873 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
874 else if (i2 == e2 || m1.ridx (i1) < m2.ridx (i2)) \ |
7269 | 875 { \ |
876 if (C1 (m1.data (i1)) OP C2 (Z2)) \ | |
877 { \ | |
878 r.ridx (nel) = m1.ridx (i1); \ | |
879 r.data (nel++) = true; \ | |
880 } \ | |
881 i1++; \ | |
882 } \ | |
883 else \ | |
884 { \ | |
885 if (C1 (m1.data (i1)) OP C2 (m2.data (i2))) \ | |
886 { \ | |
887 r.ridx (nel) = m1.ridx (i1); \ | |
888 r.data (nel++) = true; \ | |
889 } \ | |
890 i1++; \ | |
891 i2++; \ | |
892 } \ | |
893 } \ | |
894 r.cidx (j + 1) = nel; \ | |
895 } \ | |
896 r.maybe_compress (false); \ | |
897 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
898 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
899 } \ |
5164 | 900 else \ |
901 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
902 if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
903 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 904 } \ |
905 return r; \ | |
906 } | |
907 | |
908 #define SPARSE_SMSM_CMP_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
909 SPARSE_SMSM_CMP_OP (mx_el_lt, <, M1, Z1, , M2, Z2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
910 SPARSE_SMSM_CMP_OP (mx_el_le, <=, M1, Z1, , M2, Z2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
911 SPARSE_SMSM_CMP_OP (mx_el_ge, >=, M1, Z1, , M2, Z2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
912 SPARSE_SMSM_CMP_OP (mx_el_gt, >, M1, Z1, , M2, Z2, ) \ |
7269 | 913 SPARSE_SMSM_CMP_OP (mx_el_eq, ==, M1, Z1, , M2, Z2, ) \ |
914 SPARSE_SMSM_CMP_OP (mx_el_ne, !=, M1, Z1, , M2, Z2, ) | |
5164 | 915 |
916 #define SPARSE_SMSM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
7269 | 917 SPARSE_SMSM_CMP_OP (mx_el_eq, ==, M1, Z1, , M2, Z2, ) \ |
918 SPARSE_SMSM_CMP_OP (mx_el_ne, !=, M1, Z1, , M2, Z2, ) | |
5164 | 919 |
6708 | 920 #define SPARSE_SMSM_BOOL_OP_DECLS(M1, M2, API) \ |
921 SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2, API); \ | |
922 SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2, API); | |
5164 | 923 |
8198 | 924 // FIXME -- this macro duplicatest the bodies of the template |
925 // functions defined in the SPARSE_SSM_BOOL_OP and SPARSE_SMS_BOOL_OP | |
926 // macros. | |
927 | |
5164 | 928 #define SPARSE_SMSM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ |
929 SparseBoolMatrix \ | |
930 F (const M1& m1, const M2& m2) \ | |
931 { \ | |
932 SparseBoolMatrix r; \ | |
933 \ | |
5275 | 934 octave_idx_type m1_nr = m1.rows (); \ |
935 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 936 \ |
5275 | 937 octave_idx_type m2_nr = m2.rows (); \ |
938 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 939 \ |
6221 | 940 if (m1_nr == 1 && m1_nc == 1) \ |
941 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
942 if (m2_nr > 0 && m2_nc > 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
943 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
944 if ((m1.elem (0,0) != LHS_ZERO) OP RHS_ZERO) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
945 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
946 r = SparseBoolMatrix (m2_nr, m2_nc, true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
947 for (octave_idx_type j = 0; j < m2_nc; j++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
948 for (octave_idx_type i = m2.cidx (j); i < m2.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
949 if (! ((m1.elem (0,0) != LHS_ZERO) OP (m2.data (i) != RHS_ZERO))) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
950 r.data (m2.ridx (i) + j * m2_nr) = false; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
951 r.maybe_compress (true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
952 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
953 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
954 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
955 r = SparseBoolMatrix (m2_nr, m2_nc, m2.nnz ()); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
956 r.cidx (0) = static_cast<octave_idx_type> (0); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
957 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
958 for (octave_idx_type j = 0; j < m2_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
959 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
960 for (octave_idx_type i = m2.cidx (j); i < m2.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
961 if ((m1.elem (0,0) != LHS_ZERO) OP (m2.data (i) != RHS_ZERO)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
962 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
963 r.ridx (nel) = m2.ridx (i); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
964 r.data (nel++) = true; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
965 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
966 r.cidx (j + 1) = nel; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
967 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
968 r.maybe_compress (false); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
969 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
970 } \ |
6221 | 971 } \ |
972 else if (m2_nr == 1 && m2_nc == 1) \ | |
973 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
974 if (m1_nr > 0 && m1_nc > 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
975 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
976 if (LHS_ZERO OP (m2.elem (0,0) != RHS_ZERO)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
977 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
978 r = SparseBoolMatrix (m1_nr, m1_nc, true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
979 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
980 for (octave_idx_type i = m1.cidx (j); i < m1.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
981 if (! ((m1.data (i) != LHS_ZERO) OP (m2.elem (0,0) != RHS_ZERO))) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
982 r.data (m1.ridx (i) + j * m1_nr) = false; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
983 r.maybe_compress (true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
984 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
985 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
986 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
987 r = SparseBoolMatrix (m1_nr, m1_nc, m1.nnz ()); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
988 r.cidx (0) = static_cast<octave_idx_type> (0); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
989 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
990 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
991 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
992 for (octave_idx_type i = m1.cidx (j); i < m1.cidx (j+1); i++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
993 if ((m1.data (i) != LHS_ZERO) OP (m2.elem (0,0) != RHS_ZERO)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
994 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
995 r.ridx (nel) = m1.ridx (i); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
996 r.data (nel++) = true; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
997 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
998 r.cidx (j + 1) = nel; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
999 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1000 r.maybe_compress (false); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1001 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1002 } \ |
6221 | 1003 } \ |
1004 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ | |
5164 | 1005 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1006 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1007 { \ |
7269 | 1008 r = SparseBoolMatrix (m1_nr, m1_nc, m1.nnz () + m2.nnz ()); \ |
1009 r.cidx (0) = static_cast<octave_idx_type> (0); \ | |
1010 octave_idx_type nel = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1011 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
7269 | 1012 { \ |
1013 octave_idx_type i1 = m1.cidx (j); \ | |
1014 octave_idx_type e1 = m1.cidx (j+1); \ | |
1015 octave_idx_type i2 = m2.cidx (j); \ | |
1016 octave_idx_type e2 = m2.cidx (j+1); \ | |
1017 while (i1 < e1 || i2 < e2) \ | |
1018 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1019 if (i1 == e1 || (i2 < e2 && m1.ridx (i1) > m2.ridx (i2))) \ |
7269 | 1020 { \ |
1021 if (LHS_ZERO OP m2.data (i2) != RHS_ZERO) \ | |
1022 { \ | |
1023 r.ridx (nel) = m2.ridx (i2); \ | |
1024 r.data (nel++) = true; \ | |
1025 } \ | |
1026 i2++; \ | |
1027 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1028 else if (i2 == e2 || m1.ridx (i1) < m2.ridx (i2)) \ |
7269 | 1029 { \ |
1030 if (m1.data (i1) != LHS_ZERO OP RHS_ZERO) \ | |
1031 { \ | |
1032 r.ridx (nel) = m1.ridx (i1); \ | |
1033 r.data (nel++) = true; \ | |
1034 } \ | |
1035 i1++; \ | |
1036 } \ | |
1037 else \ | |
1038 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1039 if (m1.data (i1) != LHS_ZERO OP m2.data (i2) != RHS_ZERO) \ |
7269 | 1040 { \ |
1041 r.ridx (nel) = m1.ridx (i1); \ | |
1042 r.data (nel++) = true; \ | |
1043 } \ | |
1044 i1++; \ | |
1045 i2++; \ | |
1046 } \ | |
1047 } \ | |
1048 r.cidx (j + 1) = nel; \ | |
1049 } \ | |
1050 r.maybe_compress (false); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1051 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1052 } \ |
5164 | 1053 else \ |
1054 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1055 if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1056 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1057 } \ |
1058 return r; \ | |
1059 } | |
1060 | |
1061 #define SPARSE_SMSM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1062 SPARSE_SMSM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1063 SPARSE_SMSM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1064 | |
1065 #define SPARSE_SMSM_BOOL_OPS(M1, M2, ZERO) \ | |
1066 SPARSE_SMSM_BOOL_OPS2(M1, M2, ZERO, ZERO) | |
1067 | |
6708 | 1068 #define SPARSE_SMSM_OP_DECLS(R1, R2, M1, M2, API) \ |
1069 SPARSE_SMSM_BIN_OP_DECLS (R1, R2, M1, M2, API) \ | |
1070 SPARSE_SMSM_CMP_OP_DECLS (M1, M2, API) \ | |
1071 SPARSE_SMSM_BOOL_OP_DECLS (M1, M2, API) | |
5164 | 1072 |
1073 // matrix by matrix operations. | |
1074 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1075 #define SPARSE_MSM_BIN_OP_DECLS(R1, R2, M1, M2, API) \ |
6708 | 1076 SPARSE_BIN_OP_DECL (R1, operator +, M1, M2, API); \ |
1077 SPARSE_BIN_OP_DECL (R1, operator -, M1, M2, API); \ | |
1078 SPARSE_BIN_OP_DECL (R2, product, M1, M2, API); \ | |
1079 SPARSE_BIN_OP_DECL (R2, quotient, M1, M2, API); | |
5164 | 1080 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1081 #define SPARSE_MSM_BIN_OP_1(R, F, OP, M1, M2) \ |
5164 | 1082 R \ |
1083 F (const M1& m1, const M2& m2) \ | |
1084 { \ | |
1085 R r; \ | |
1086 \ | |
5275 | 1087 octave_idx_type m1_nr = m1.rows (); \ |
1088 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1089 \ |
5275 | 1090 octave_idx_type m2_nr = m2.rows (); \ |
1091 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1092 \ |
6221 | 1093 if (m2_nr == 1 && m2_nc == 1) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1094 r = R (m1 OP m2.elem (0,0)); \ |
6221 | 1095 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ |
5164 | 1096 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
1097 else \ | |
1098 { \ | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1099 r = R (F (m1, m2.matrix_value ())); \ |
5164 | 1100 } \ |
1101 return r; \ | |
1102 } | |
1103 | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1104 #define SPARSE_MSM_BIN_OP_2(R, F, OP, M1, M2) \ |
5164 | 1105 R \ |
1106 F (const M1& m1, const M2& m2) \ | |
1107 { \ | |
1108 R r; \ | |
1109 \ | |
5275 | 1110 octave_idx_type m1_nr = m1.rows (); \ |
1111 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1112 \ |
5275 | 1113 octave_idx_type m2_nr = m2.rows (); \ |
1114 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1115 \ |
6221 | 1116 if (m2_nr == 1 && m2_nc == 1) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1117 r = R (m1 OP m2.elem (0,0)); \ |
6221 | 1118 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ |
5164 | 1119 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
1120 else \ | |
1121 { \ | |
13731
3b52038e6e6c
Help dumb compilers to resolve template parameters.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
11523
diff
changeset
|
1122 if (do_mx_check (m1, mx_inline_all_finite<M1::element_type>)) \ |
5164 | 1123 { \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1124 /* Sparsity pattern is preserved. */ \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1125 octave_idx_type m2_nz = m2.nnz (); \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1126 r = R (m2_nr, m2_nc, m2_nz); \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1127 for (octave_idx_type j = 0, k = 0; j < m2_nc; j++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1128 { \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1129 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1130 for (octave_idx_type i = m2.cidx (j); i < m2.cidx (j+1); i++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1131 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1132 octave_idx_type mri = m2.ridx (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1133 R::element_type x = m1(mri, j) OP m2.data (i); \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1134 if (x != 0.0) \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1135 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1136 r.xdata (k) = x; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1137 r.xridx (k) = m2.ridx (i); \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1138 k++; \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1139 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1140 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1141 r.xcidx (j+1) = k; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1142 } \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1143 r.maybe_compress (false); \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1144 return r; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1145 } \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1146 else \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1147 r = R (F (m1, m2.matrix_value ())); \ |
5164 | 1148 } \ |
1149 \ | |
1150 return r; \ | |
1151 } | |
1152 | |
5775 | 1153 // FIXME Pass a specific ZERO value |
5164 | 1154 #define SPARSE_MSM_BIN_OPS(R1, R2, M1, M2) \ |
1155 SPARSE_MSM_BIN_OP_1 (R1, operator +, +, M1, M2) \ | |
1156 SPARSE_MSM_BIN_OP_1 (R1, operator -, -, M1, M2) \ | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1157 SPARSE_MSM_BIN_OP_2 (R2, product, *, M1, M2) \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1158 SPARSE_MSM_BIN_OP_1 (R2, quotient, /, M1, M2) |
5164 | 1159 |
6708 | 1160 #define SPARSE_MSM_CMP_OP_DECLS(M1, M2, API) \ |
1161 SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2, API); \ | |
1162 SPARSE_CMP_OP_DECL (mx_el_le, M1, M2, API); \ | |
1163 SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2, API); \ | |
1164 SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2, API); \ | |
1165 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
1166 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 1167 |
6708 | 1168 #define SPARSE_MSM_EQNE_OP_DECLS(M1, M2, API) \ |
1169 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
1170 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 1171 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1172 #define SPARSE_MSM_CMP_OP(F, OP, M1, C1, M2, C2) \ |
5164 | 1173 SparseBoolMatrix \ |
1174 F (const M1& m1, const M2& m2) \ | |
1175 { \ | |
1176 SparseBoolMatrix r; \ | |
1177 \ | |
5275 | 1178 octave_idx_type m1_nr = m1.rows (); \ |
1179 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1180 \ |
5275 | 1181 octave_idx_type m2_nr = m2.rows (); \ |
1182 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1183 \ |
6221 | 1184 if (m2_nr == 1 && m2_nc == 1) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1185 r = SparseBoolMatrix (F (m1, m2.elem (0,0))); \ |
6221 | 1186 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ |
5164 | 1187 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1188 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1189 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1190 /* Count num of non-zero elements */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1191 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1192 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1193 for (octave_idx_type i = 0; i < m1_nr; i++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1194 if (C1 (m1.elem (i, j)) OP C2 (m2.elem (i, j))) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1195 nel++; \ |
5164 | 1196 \ |
1197 r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ | |
1198 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1199 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1200 r.cidx (0) = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1201 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1202 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1203 for (octave_idx_type i = 0; i < m1_nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1204 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1205 bool el = C1 (m1.elem (i, j)) OP C2 (m2.elem (i, j)); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1206 if (el) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1207 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1208 r.data (ii) = el; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1209 r.ridx (ii++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1210 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1211 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1212 r.cidx (j+1) = ii; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1213 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1214 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1215 } \ |
5164 | 1216 else \ |
1217 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1218 if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1219 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1220 } \ |
1221 return r; \ | |
1222 } | |
1223 | |
1224 #define SPARSE_MSM_CMP_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1225 SPARSE_MSM_CMP_OP (mx_el_lt, <, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1226 SPARSE_MSM_CMP_OP (mx_el_le, <=, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1227 SPARSE_MSM_CMP_OP (mx_el_ge, >=, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1228 SPARSE_MSM_CMP_OP (mx_el_gt, >, M1, , M2, ) \ |
5164 | 1229 SPARSE_MSM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ |
1230 SPARSE_MSM_CMP_OP (mx_el_ne, !=, M1, , M2, ) | |
1231 | |
1232 #define SPARSE_MSM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
1233 SPARSE_MSM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ | |
1234 SPARSE_MSM_CMP_OP (mx_el_ne, !=, M1, , M2, ) | |
1235 | |
6708 | 1236 #define SPARSE_MSM_BOOL_OP_DECLS(M1, M2, API) \ |
1237 SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2, API); \ | |
1238 SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2, API); | |
5164 | 1239 |
1240 #define SPARSE_MSM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1241 SparseBoolMatrix \ | |
1242 F (const M1& m1, const M2& m2) \ | |
1243 { \ | |
1244 SparseBoolMatrix r; \ | |
1245 \ | |
5275 | 1246 octave_idx_type m1_nr = m1.rows (); \ |
1247 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1248 \ |
5275 | 1249 octave_idx_type m2_nr = m2.rows (); \ |
1250 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1251 \ |
6221 | 1252 if (m2_nr == 1 && m2_nc == 1) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1253 r = SparseBoolMatrix (F (m1, m2.elem (0,0))); \ |
6221 | 1254 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ |
5164 | 1255 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1256 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1257 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1258 /* Count num of non-zero elements */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1259 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1260 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1261 for (octave_idx_type i = 0; i < m1_nr; i++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1262 if ((m1.elem (i, j) != LHS_ZERO) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1263 OP (m2.elem (i, j) != RHS_ZERO)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1264 nel++; \ |
5164 | 1265 \ |
1266 r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ | |
1267 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1268 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1269 r.cidx (0) = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1270 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1271 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1272 for (octave_idx_type i = 0; i < m1_nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1273 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1274 bool el = (m1.elem (i, j) != LHS_ZERO) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1275 OP (m2.elem (i, j) != RHS_ZERO); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1276 if (el) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1277 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1278 r.data (ii) = el; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1279 r.ridx (ii++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1280 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1281 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1282 r.cidx (j+1) = ii; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1283 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1284 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1285 } \ |
5164 | 1286 else \ |
1287 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1288 if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1289 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1290 } \ |
1291 return r; \ | |
1292 } | |
1293 | |
1294 #define SPARSE_MSM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1295 SPARSE_MSM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1296 SPARSE_MSM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1297 | |
1298 #define SPARSE_MSM_BOOL_OPS(M1, M2, ZERO) \ | |
1299 SPARSE_MSM_BOOL_OPS2(M1, M2, ZERO, ZERO) | |
1300 | |
6708 | 1301 #define SPARSE_MSM_OP_DECLS(R1, R2, M1, M2, API) \ |
1302 SPARSE_MSM_BIN_OP_DECLS (R1, R2, M1, M2, API) \ | |
1303 SPARSE_MSM_CMP_OP_DECLS (M1, M2, API) \ | |
1304 SPARSE_MSM_BOOL_OP_DECLS (M1, M2, API) | |
5164 | 1305 |
1306 // matrix by matrix operations. | |
1307 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1308 #define SPARSE_SMM_BIN_OP_DECLS(R1, R2, M1, M2, API) \ |
6708 | 1309 SPARSE_BIN_OP_DECL (R1, operator +, M1, M2, API); \ |
1310 SPARSE_BIN_OP_DECL (R1, operator -, M1, M2, API); \ | |
1311 SPARSE_BIN_OP_DECL (R2, product, M1, M2, API); \ | |
1312 SPARSE_BIN_OP_DECL (R2, quotient, M1, M2, API); | |
5164 | 1313 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1314 #define SPARSE_SMM_BIN_OP_1(R, F, OP, M1, M2) \ |
5164 | 1315 R \ |
1316 F (const M1& m1, const M2& m2) \ | |
1317 { \ | |
1318 R r; \ | |
1319 \ | |
5275 | 1320 octave_idx_type m1_nr = m1.rows (); \ |
1321 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1322 \ |
5275 | 1323 octave_idx_type m2_nr = m2.rows (); \ |
1324 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1325 \ |
6221 | 1326 if (m1_nr == 1 && m1_nc == 1) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1327 r = R (m1.elem (0,0) OP m2); \ |
6221 | 1328 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ |
5164 | 1329 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
1330 else \ | |
1331 { \ | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1332 r = R (m1.matrix_value () OP m2); \ |
5164 | 1333 } \ |
1334 return r; \ | |
1335 } | |
1336 | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1337 // sm .* m preserves sparsity if m contains no Infs nor Nans. |
13731
3b52038e6e6c
Help dumb compilers to resolve template parameters.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
11523
diff
changeset
|
1338 #define SPARSE_SMM_BIN_OP_2_CHECK_product(ET) \ |
3b52038e6e6c
Help dumb compilers to resolve template parameters.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
11523
diff
changeset
|
1339 do_mx_check (m2, mx_inline_all_finite<ET>) |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1340 |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1341 // sm ./ m preserves sparsity if m contains no NaNs or zeros. |
13731
3b52038e6e6c
Help dumb compilers to resolve template parameters.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
11523
diff
changeset
|
1342 #define SPARSE_SMM_BIN_OP_2_CHECK_quotient(ET) \ |
3b52038e6e6c
Help dumb compilers to resolve template parameters.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
11523
diff
changeset
|
1343 ! do_mx_check (m2, mx_inline_any_nan<ET>) && m2.nnz () == m2.numel () |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1344 |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1345 #define SPARSE_SMM_BIN_OP_2(R, F, OP, M1, M2) \ |
5164 | 1346 R \ |
1347 F (const M1& m1, const M2& m2) \ | |
1348 { \ | |
1349 R r; \ | |
1350 \ | |
5275 | 1351 octave_idx_type m1_nr = m1.rows (); \ |
1352 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1353 \ |
5275 | 1354 octave_idx_type m2_nr = m2.rows (); \ |
1355 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1356 \ |
6221 | 1357 if (m1_nr == 1 && m1_nc == 1) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1358 r = R (m1.elem (0,0) OP m2); \ |
6221 | 1359 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ |
5164 | 1360 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
1361 else \ | |
1362 { \ | |
13731
3b52038e6e6c
Help dumb compilers to resolve template parameters.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
11523
diff
changeset
|
1363 if (SPARSE_SMM_BIN_OP_2_CHECK_ ## F(M2::element_type)) \ |
5164 | 1364 { \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1365 /* Sparsity pattern is preserved. */ \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1366 octave_idx_type m1_nz = m1.nnz (); \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1367 r = R (m1_nr, m1_nc, m1_nz); \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1368 for (octave_idx_type j = 0, k = 0; j < m1_nc; j++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1369 { \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1370 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1371 for (octave_idx_type i = m1.cidx (j); i < m1.cidx (j+1); i++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1372 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1373 octave_idx_type mri = m1.ridx (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1374 R::element_type x = m1.data (i) OP m2 (mri, j); \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1375 if (x != 0.0) \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1376 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1377 r.xdata (k) = x; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1378 r.xridx (k) = m1.ridx (i); \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1379 k++; \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1380 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1381 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1382 r.xcidx (j+1) = k; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1383 } \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1384 r.maybe_compress (false); \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1385 return r; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1386 } \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1387 else \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1388 r = R (F (m1.matrix_value (), m2)); \ |
5164 | 1389 } \ |
1390 \ | |
1391 return r; \ | |
1392 } | |
1393 | |
1394 #define SPARSE_SMM_BIN_OPS(R1, R2, M1, M2) \ | |
1395 SPARSE_SMM_BIN_OP_1 (R1, operator +, +, M1, M2) \ | |
1396 SPARSE_SMM_BIN_OP_1 (R1, operator -, -, M1, M2) \ | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1397 SPARSE_SMM_BIN_OP_2 (R2, product, *, M1, M2) \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1398 SPARSE_SMM_BIN_OP_2 (R2, quotient, /, M1, M2) |
5164 | 1399 |
6708 | 1400 #define SPARSE_SMM_CMP_OP_DECLS(M1, M2, API) \ |
1401 SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2, API); \ | |
1402 SPARSE_CMP_OP_DECL (mx_el_le, M1, M2, API); \ | |
1403 SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2, API); \ | |
1404 SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2, API); \ | |
1405 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
1406 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 1407 |
6708 | 1408 #define SPARSE_SMM_EQNE_OP_DECLS(M1, M2, API) \ |
1409 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
1410 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 1411 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1412 #define SPARSE_SMM_CMP_OP(F, OP, M1, C1, M2, C2) \ |
5164 | 1413 SparseBoolMatrix \ |
1414 F (const M1& m1, const M2& m2) \ | |
1415 { \ | |
1416 SparseBoolMatrix r; \ | |
1417 \ | |
5275 | 1418 octave_idx_type m1_nr = m1.rows (); \ |
1419 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1420 \ |
5275 | 1421 octave_idx_type m2_nr = m2.rows (); \ |
1422 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1423 \ |
6221 | 1424 if (m1_nr == 1 && m1_nc == 1) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1425 r = SparseBoolMatrix (F (m1.elem (0,0), m2)); \ |
6221 | 1426 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ |
5164 | 1427 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1428 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1429 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1430 /* Count num of non-zero elements */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1431 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1432 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1433 for (octave_idx_type i = 0; i < m1_nr; i++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1434 if (C1 (m1.elem (i, j)) OP C2 (m2.elem (i, j))) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1435 nel++; \ |
5164 | 1436 \ |
1437 r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ | |
1438 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1439 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1440 r.cidx (0) = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1441 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1442 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1443 for (octave_idx_type i = 0; i < m1_nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1444 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1445 bool el = C1 (m1.elem (i, j)) OP C2 (m2.elem (i, j)); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1446 if (el) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1447 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1448 r.data (ii) = el; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1449 r.ridx (ii++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1450 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1451 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1452 r.cidx (j+1) = ii; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1453 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1454 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1455 } \ |
5164 | 1456 else \ |
1457 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1458 if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1459 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1460 } \ |
1461 return r; \ | |
1462 } | |
1463 | |
1464 #define SPARSE_SMM_CMP_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
9578
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1465 SPARSE_SMM_CMP_OP (mx_el_lt, <, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1466 SPARSE_SMM_CMP_OP (mx_el_le, <=, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1467 SPARSE_SMM_CMP_OP (mx_el_ge, >=, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1468 SPARSE_SMM_CMP_OP (mx_el_gt, >, M1, , M2, ) \ |
5164 | 1469 SPARSE_SMM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ |
1470 SPARSE_SMM_CMP_OP (mx_el_ne, !=, M1, , M2, ) | |
1471 | |
1472 #define SPARSE_SMM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
1473 SPARSE_SMM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ | |
1474 SPARSE_SMM_CMP_OP (mx_el_ne, !=, M1, , M2, ) | |
1475 | |
6708 | 1476 #define SPARSE_SMM_BOOL_OP_DECLS(M1, M2, API) \ |
1477 SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2, API); \ | |
1478 SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2, API); | |
5164 | 1479 |
1480 #define SPARSE_SMM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1481 SparseBoolMatrix \ | |
1482 F (const M1& m1, const M2& m2) \ | |
1483 { \ | |
1484 SparseBoolMatrix r; \ | |
1485 \ | |
5275 | 1486 octave_idx_type m1_nr = m1.rows (); \ |
1487 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1488 \ |
5275 | 1489 octave_idx_type m2_nr = m2.rows (); \ |
1490 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1491 \ |
6221 | 1492 if (m1_nr == 1 && m1_nc == 1) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1493 r = SparseBoolMatrix (F (m1.elem (0,0), m2)); \ |
6221 | 1494 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ |
5164 | 1495 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1496 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1497 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1498 /* Count num of non-zero elements */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1499 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1500 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1501 for (octave_idx_type i = 0; i < m1_nr; i++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1502 if ((m1.elem (i, j) != LHS_ZERO) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1503 OP (m2.elem (i, j) != RHS_ZERO)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1504 nel++; \ |
5164 | 1505 \ |
1506 r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ | |
1507 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1508 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1509 r.cidx (0) = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1510 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1511 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1512 for (octave_idx_type i = 0; i < m1_nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1513 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1514 bool el = (m1.elem (i, j) != LHS_ZERO) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1515 OP (m2.elem (i, j) != RHS_ZERO); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1516 if (el) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1517 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1518 r.data (ii) = el; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1519 r.ridx (ii++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1520 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1521 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1522 r.cidx (j+1) = ii; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1523 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1524 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1525 } \ |
5164 | 1526 else \ |
1527 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1528 if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1529 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1530 } \ |
1531 return r; \ | |
1532 } | |
1533 | |
1534 #define SPARSE_SMM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1535 SPARSE_SMM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1536 SPARSE_SMM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1537 | |
1538 #define SPARSE_SMM_BOOL_OPS(M1, M2, ZERO) \ | |
1539 SPARSE_SMM_BOOL_OPS2(M1, M2, ZERO, ZERO) | |
1540 | |
6708 | 1541 #define SPARSE_SMM_OP_DECLS(R1, R2, M1, M2, API) \ |
1542 SPARSE_SMM_BIN_OP_DECLS (R1, R2, M1, M2, API) \ | |
1543 SPARSE_SMM_CMP_OP_DECLS (M1, M2, API) \ | |
1544 SPARSE_SMM_BOOL_OP_DECLS (M1, M2, API) | |
5164 | 1545 |
1546 // Avoid some code duplication. Maybe we should use templates. | |
1547 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1548 #define SPARSE_CUMSUM(RET_TYPE, ELT_TYPE, FCN) \ |
5164 | 1549 \ |
5275 | 1550 octave_idx_type nr = rows (); \ |
1551 octave_idx_type nc = cols (); \ | |
5164 | 1552 \ |
1553 RET_TYPE retval; \ | |
1554 \ | |
1555 if (nr > 0 && nc > 0) \ | |
1556 { \ | |
1557 if ((nr == 1 && dim == -1) || dim == 1) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1558 /* Ugly!! Is there a better way? */ \ |
5164 | 1559 retval = transpose (). FCN (0) .transpose (); \ |
1560 else \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1561 { \ |
5275 | 1562 octave_idx_type nel = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1563 for (octave_idx_type i = 0; i < nc; i++) \ |
5164 | 1564 { \ |
1565 ELT_TYPE t = ELT_TYPE (); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1566 for (octave_idx_type j = cidx (i); j < cidx (i+1); j++) \ |
5164 | 1567 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1568 t += data (j); \ |
5164 | 1569 if (t != ELT_TYPE ()) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1570 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1571 if (j == cidx (i+1) - 1) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1572 nel += nr - ridx (j); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1573 else \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1574 nel += ridx (j+1) - ridx (j); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1575 } \ |
5164 | 1576 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1577 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1578 retval = RET_TYPE (nr, nc, nel); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1579 retval.cidx (0) = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1580 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1581 for (octave_idx_type i = 0; i < nc; i++) \ |
5164 | 1582 { \ |
1583 ELT_TYPE t = ELT_TYPE (); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1584 for (octave_idx_type j = cidx (i); j < cidx (i+1); j++) \ |
5164 | 1585 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1586 t += data (j); \ |
5164 | 1587 if (t != ELT_TYPE ()) \ |
1588 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1589 if (j == cidx (i+1) - 1) \ |
5164 | 1590 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1591 for (octave_idx_type k = ridx (j); k < nr; k++) \ |
5164 | 1592 { \ |
1593 retval.data (ii) = t; \ | |
1594 retval.ridx (ii++) = k; \ | |
1595 } \ | |
1596 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1597 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1598 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1599 for (octave_idx_type k = ridx (j); k < ridx (j+1); k++) \ |
5164 | 1600 { \ |
1601 retval.data (ii) = t; \ | |
1602 retval.ridx (ii++) = k; \ | |
1603 } \ | |
1604 } \ | |
1605 } \ | |
1606 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1607 retval.cidx (i+1) = ii; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1608 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1609 } \ |
5164 | 1610 } \ |
1611 else \ | |
1612 retval = RET_TYPE (nr,nc); \ | |
1613 \ | |
1614 return retval | |
1615 | |
1616 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1617 #define SPARSE_CUMPROD(RET_TYPE, ELT_TYPE, FCN) \ |
5164 | 1618 \ |
5275 | 1619 octave_idx_type nr = rows (); \ |
1620 octave_idx_type nc = cols (); \ | |
5164 | 1621 \ |
1622 RET_TYPE retval; \ | |
1623 \ | |
1624 if (nr > 0 && nc > 0) \ | |
1625 { \ | |
1626 if ((nr == 1 && dim == -1) || dim == 1) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1627 /* Ugly!! Is there a better way? */ \ |
5164 | 1628 retval = transpose (). FCN (0) .transpose (); \ |
1629 else \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1630 { \ |
5275 | 1631 octave_idx_type nel = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1632 for (octave_idx_type i = 0; i < nc; i++) \ |
5164 | 1633 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1634 octave_idx_type jj = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1635 for (octave_idx_type j = cidx (i); j < cidx (i+1); j++) \ |
5164 | 1636 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1637 if (jj == ridx (j)) \ |
5164 | 1638 { \ |
1639 nel++; \ | |
1640 jj++; \ | |
1641 } \ | |
1642 else \ | |
1643 break; \ | |
1644 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1645 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1646 retval = RET_TYPE (nr, nc, nel); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1647 retval.cidx (0) = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1648 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1649 for (octave_idx_type i = 0; i < nc; i++) \ |
5164 | 1650 { \ |
1651 ELT_TYPE t = ELT_TYPE (1.); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1652 octave_idx_type jj = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1653 for (octave_idx_type j = cidx (i); j < cidx (i+1); j++) \ |
5164 | 1654 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1655 if (jj == ridx (j)) \ |
5164 | 1656 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1657 t *= data (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1658 retval.data (ii) = t; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1659 retval.ridx (ii++) = jj++; \ |
5164 | 1660 } \ |
1661 else \ | |
1662 break; \ | |
1663 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1664 retval.cidx (i+1) = ii; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1665 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1666 } \ |
5164 | 1667 } \ |
1668 else \ | |
1669 retval = RET_TYPE (nr,nc); \ | |
1670 \ | |
1671 return retval | |
1672 | |
1673 #define SPARSE_BASE_REDUCTION_OP(RET_TYPE, EL_TYPE, ROW_EXPR, COL_EXPR, \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1674 INIT_VAL, MT_RESULT) \ |
5164 | 1675 \ |
5275 | 1676 octave_idx_type nr = rows (); \ |
1677 octave_idx_type nc = cols (); \ | |
5164 | 1678 \ |
1679 RET_TYPE retval; \ | |
1680 \ | |
1681 if (nr > 0 && nc > 0) \ | |
1682 { \ | |
1683 if ((nr == 1 && dim == -1) || dim == 1) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1684 { \ |
7269 | 1685 /* Define j here to allow fancy definition for prod method */ \ |
1686 octave_idx_type j = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1687 OCTAVE_LOCAL_BUFFER (EL_TYPE, tmp, nr); \ |
5164 | 1688 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1689 for (octave_idx_type i = 0; i < nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1690 tmp[i] = INIT_VAL; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1691 for (j = 0; j < nc; j++) \ |
7269 | 1692 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1693 for (octave_idx_type i = cidx (j); i < cidx (j + 1); i++) \ |
7269 | 1694 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1695 ROW_EXPR; \ |
7269 | 1696 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1697 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1698 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1699 for (octave_idx_type i = 0; i < nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1700 if (tmp[i] != EL_TYPE ()) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1701 nel++ ; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1702 retval = RET_TYPE (nr, static_cast<octave_idx_type> (1), nel); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1703 retval.cidx (0) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1704 retval.cidx (1) = nel; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1705 nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1706 for (octave_idx_type i = 0; i < nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1707 if (tmp[i] != EL_TYPE ()) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1708 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1709 retval.data (nel) = tmp[i]; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1710 retval.ridx (nel++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1711 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1712 } \ |
5164 | 1713 else \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1714 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1715 OCTAVE_LOCAL_BUFFER (EL_TYPE, tmp, nc); \ |
5164 | 1716 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1717 for (octave_idx_type j = 0; j < nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1718 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1719 tmp[j] = INIT_VAL; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1720 for (octave_idx_type i = cidx (j); i < cidx (j + 1); i++) \ |
7269 | 1721 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1722 COL_EXPR; \ |
7269 | 1723 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1724 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1725 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1726 for (octave_idx_type i = 0; i < nc; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1727 if (tmp[i] != EL_TYPE ()) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1728 nel++ ; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1729 retval = RET_TYPE (static_cast<octave_idx_type> (1), nc, nel); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1730 retval.cidx (0) = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1731 nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1732 for (octave_idx_type i = 0; i < nc; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1733 if (tmp[i] != EL_TYPE ()) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1734 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1735 retval.data (nel) = tmp[i]; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1736 retval.ridx (nel++) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1737 retval.cidx (i+1) = retval.cidx (i) + 1; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1738 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1739 else \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1740 retval.cidx (i+1) = retval.cidx (i); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1741 } \ |
5164 | 1742 } \ |
1743 else if (nc == 0 && (nr == 0 || (nr == 1 && dim == -1))) \ | |
1744 { \ | |
7197 | 1745 if (MT_RESULT) \ |
1746 { \ | |
1747 retval = RET_TYPE (static_cast<octave_idx_type> (1), \ | |
1748 static_cast<octave_idx_type> (1), \ | |
1749 static_cast<octave_idx_type> (1)); \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1750 retval.cidx (0) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1751 retval.cidx (1) = 1; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1752 retval.ridx (0) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1753 retval.data (0) = MT_RESULT; \ |
7197 | 1754 } \ |
1755 else \ | |
1756 retval = RET_TYPE (static_cast<octave_idx_type> (1), \ | |
1757 static_cast<octave_idx_type> (1), \ | |
1758 static_cast<octave_idx_type> (0)); \ | |
5164 | 1759 } \ |
1760 else if (nr == 0 && (dim == 0 || dim == -1)) \ | |
1761 { \ | |
7197 | 1762 if (MT_RESULT) \ |
5164 | 1763 { \ |
7197 | 1764 retval = RET_TYPE (static_cast<octave_idx_type> (1), nc, nc); \ |
1765 retval.cidx (0) = 0; \ | |
1766 for (octave_idx_type i = 0; i < nc ; i++) \ | |
1767 { \ | |
1768 retval.ridx (i) = 0; \ | |
17286
79d4b6089968
Fix isequal for sparse matrix (bug #37321)
Stefan Mahr <dac922@gmx.de>
parents:
15271
diff
changeset
|
1769 retval.cidx (i+1) = i+1; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1770 retval.data (i) = MT_RESULT; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1771 } \ |
7197 | 1772 } \ |
1773 else \ | |
1774 retval = RET_TYPE (static_cast<octave_idx_type> (1), nc, \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1775 static_cast<octave_idx_type> (0)); \ |
5164 | 1776 } \ |
1777 else if (nc == 0 && dim == 1) \ | |
1778 { \ | |
7197 | 1779 if (MT_RESULT) \ |
1780 { \ | |
1781 retval = RET_TYPE (nr, static_cast<octave_idx_type> (1), nr); \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1782 retval.cidx (0) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1783 retval.cidx (1) = nr; \ |
7197 | 1784 for (octave_idx_type i = 0; i < nr; i++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1785 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1786 retval.ridx (i) = i; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1787 retval.data (i) = MT_RESULT; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1788 } \ |
7197 | 1789 } \ |
1790 else \ | |
1791 retval = RET_TYPE (nr, static_cast<octave_idx_type> (1), \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1792 static_cast<octave_idx_type> (0)); \ |
5164 | 1793 } \ |
1794 else \ | |
1795 retval.resize (nr > 0, nc > 0); \ | |
1796 \ | |
1797 return retval | |
1798 | |
1799 #define SPARSE_REDUCTION_OP_ROW_EXPR(OP) \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1800 tmp[ridx (i)] OP data (i) |
5164 | 1801 |
1802 #define SPARSE_REDUCTION_OP_COL_EXPR(OP) \ | |
7269 | 1803 tmp[j] OP data (i) |
5164 | 1804 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1805 #define SPARSE_REDUCTION_OP(RET_TYPE, EL_TYPE, OP, INIT_VAL, MT_RESULT) \ |
5164 | 1806 SPARSE_BASE_REDUCTION_OP (RET_TYPE, EL_TYPE, \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1807 SPARSE_REDUCTION_OP_ROW_EXPR (OP), \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1808 SPARSE_REDUCTION_OP_COL_EXPR (OP), \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1809 INIT_VAL, MT_RESULT) |
5164 | 1810 |
7350 | 1811 |
1812 // Don't break from this loop if the test succeeds because | |
1813 // we are looping over the rows and not the columns in the inner | |
1814 // loop. | |
5164 | 1815 #define SPARSE_ANY_ALL_OP_ROW_CODE(TEST_OP, TEST_TRUE_VAL) \ |
7269 | 1816 if (data (i) TEST_OP 0.0) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1817 tmp[ridx (i)] = TEST_TRUE_VAL; \ |
5164 | 1818 |
1819 #define SPARSE_ANY_ALL_OP_COL_CODE(TEST_OP, TEST_TRUE_VAL) \ | |
7269 | 1820 if (data (i) TEST_OP 0.0) \ |
5164 | 1821 { \ |
1822 tmp[j] = TEST_TRUE_VAL; \ | |
1823 break; \ | |
1824 } | |
1825 | |
7269 | 1826 #define SPARSE_ANY_ALL_OP(DIM, INIT_VAL, MT_RESULT, TEST_OP, TEST_TRUE_VAL) \ |
5164 | 1827 SPARSE_BASE_REDUCTION_OP (SparseBoolMatrix, char, \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1828 SPARSE_ANY_ALL_OP_ROW_CODE (TEST_OP, TEST_TRUE_VAL), \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1829 SPARSE_ANY_ALL_OP_COL_CODE (TEST_OP, TEST_TRUE_VAL), \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1830 INIT_VAL, MT_RESULT) |
5164 | 1831 |
7269 | 1832 #define SPARSE_ALL_OP(DIM) \ |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
1833 if ((rows () == 1 && dim == -1) || dim == 1) \ |
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
1834 return transpose (). all (0). transpose (); \ |
7269 | 1835 else \ |
1836 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1837 SPARSE_ANY_ALL_OP (DIM, (cidx (j+1) - cidx (j) < nr ? false : true), \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1838 true, ==, false); \ |
7269 | 1839 } |
5164 | 1840 |
7269 | 1841 #define SPARSE_ANY_OP(DIM) SPARSE_ANY_ALL_OP (DIM, false, false, !=, true) |
5164 | 1842 |
5681 | 1843 #define SPARSE_SPARSE_MUL( RET_TYPE, RET_EL_TYPE, EL_TYPE ) \ |
5275 | 1844 octave_idx_type nr = m.rows (); \ |
1845 octave_idx_type nc = m.cols (); \ | |
5164 | 1846 \ |
5275 | 1847 octave_idx_type a_nr = a.rows (); \ |
1848 octave_idx_type a_nc = a.cols (); \ | |
5164 | 1849 \ |
6221 | 1850 if (nr == 1 && nc == 1) \ |
1851 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1852 RET_EL_TYPE s = m.elem (0,0); \ |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
1853 octave_idx_type nz = a.nnz (); \ |
6221 | 1854 RET_TYPE r (a_nr, a_nc, nz); \ |
1855 \ | |
1856 for (octave_idx_type i = 0; i < nz; i++) \ | |
1857 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
1858 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1859 r.data (i) = s * a.data (i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1860 r.ridx (i) = a.ridx (i); \ |
6221 | 1861 } \ |
1862 for (octave_idx_type i = 0; i < a_nc + 1; i++) \ | |
1863 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
1864 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1865 r.cidx (i) = a.cidx (i); \ |
6221 | 1866 } \ |
1867 \ | |
1868 r.maybe_compress (true); \ | |
1869 return r; \ | |
1870 } \ | |
1871 else if (a_nr == 1 && a_nc == 1) \ | |
1872 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1873 RET_EL_TYPE s = a.elem (0,0); \ |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
1874 octave_idx_type nz = m.nnz (); \ |
6221 | 1875 RET_TYPE r (nr, nc, nz); \ |
1876 \ | |
1877 for (octave_idx_type i = 0; i < nz; i++) \ | |
1878 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
1879 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1880 r.data (i) = m.data (i) * s; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1881 r.ridx (i) = m.ridx (i); \ |
6221 | 1882 } \ |
1883 for (octave_idx_type i = 0; i < nc + 1; i++) \ | |
1884 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
1885 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1886 r.cidx (i) = m.cidx (i); \ |
6221 | 1887 } \ |
1888 \ | |
1889 r.maybe_compress (true); \ | |
1890 return r; \ | |
1891 } \ | |
1892 else if (nc != a_nr) \ | |
5164 | 1893 { \ |
1894 gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ | |
1895 return RET_TYPE (); \ | |
1896 } \ | |
1897 else \ | |
1898 { \ | |
5586 | 1899 OCTAVE_LOCAL_BUFFER (octave_idx_type, w, nr); \ |
5876 | 1900 RET_TYPE retval (nr, a_nc, static_cast<octave_idx_type> (0)); \ |
5586 | 1901 for (octave_idx_type i = 0; i < nr; i++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1902 w[i] = 0; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1903 retval.xcidx (0) = 0; \ |
5164 | 1904 \ |
5275 | 1905 octave_idx_type nel = 0; \ |
5164 | 1906 \ |
5275 | 1907 for (octave_idx_type i = 0; i < a_nc; i++) \ |
5164 | 1908 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1909 for (octave_idx_type j = a.cidx (i); j < a.cidx (i+1); j++) \ |
5164 | 1910 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1911 octave_idx_type col = a.ridx (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1912 for (octave_idx_type k = m.cidx (col) ; k < m.cidx (col+1); k++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1913 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1914 if (w[m.ridx (k)] < i + 1) \ |
5586 | 1915 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1916 w[m.ridx (k)] = i + 1; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1917 nel++; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1918 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1919 octave_quit (); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1920 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1921 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1922 retval.xcidx (i+1) = nel; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1923 } \ |
5164 | 1924 \ |
1925 if (nel == 0) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1926 return RET_TYPE (nr, a_nc); \ |
5164 | 1927 else \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1928 { \ |
5586 | 1929 for (octave_idx_type i = 0; i < nr; i++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1930 w[i] = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1931 \ |
5681 | 1932 OCTAVE_LOCAL_BUFFER (RET_EL_TYPE, Xcol, nr); \ |
5586 | 1933 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1934 retval.change_capacity (nel); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1935 /* The optimal break-point as estimated from simulations */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1936 /* Note that Mergesort is O(nz log(nz)) while searching all */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1937 /* values is O(nr), where nz here is non-zero per row of */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1938 /* length nr. The test itself was then derived from the */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1939 /* simulation with random square matrices and the observation */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1940 /* of the number of non-zero elements in the output matrix */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1941 /* it was found that the breakpoints were */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1942 /* nr: 500 1000 2000 5000 10000 */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1943 /* nz: 6 25 97 585 2202 */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1944 /* The below is a simplication of the 'polyfit'-ed parameters */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1945 /* to these breakpoints */ \ |
5795 | 1946 octave_idx_type n_per_col = (a_nc > 43000 ? 43000 : \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1947 (a_nc * a_nc) / 43000); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1948 octave_idx_type ii = 0; \ |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
1949 octave_idx_type *ri = retval.xridx (); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1950 octave_sort<octave_idx_type> sort; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1951 \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1952 for (octave_idx_type i = 0; i < a_nc ; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1953 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1954 if (retval.xcidx (i+1) - retval.xcidx (i) > n_per_col) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1955 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1956 for (octave_idx_type j = a.cidx (i); j < a.cidx (i+1); j++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1957 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1958 octave_idx_type col = a.ridx (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1959 EL_TYPE tmpval = a.data (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1960 for (octave_idx_type k = m.cidx (col) ; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1961 k < m.cidx (col+1); k++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1962 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1963 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1964 octave_idx_type row = m.ridx (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1965 if (w[row] < i + 1) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1966 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1967 w[row] = i + 1; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1968 Xcol[row] = tmpval * m.data (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1969 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1970 else \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1971 Xcol[row] += tmpval * m.data (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1972 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1973 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1974 for (octave_idx_type k = 0; k < nr; k++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1975 if (w[k] == i + 1) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1976 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1977 retval.xdata (ii) = Xcol[k]; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1978 retval.xridx (ii++) = k; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1979 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1980 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1981 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1982 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1983 for (octave_idx_type j = a.cidx (i); j < a.cidx (i+1); j++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1984 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1985 octave_idx_type col = a.ridx (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1986 EL_TYPE tmpval = a.data (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1987 for (octave_idx_type k = m.cidx (col) ; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1988 k < m.cidx (col+1); k++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1989 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1990 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1991 octave_idx_type row = m.ridx (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1992 if (w[row] < i + 1) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1993 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1994 w[row] = i + 1; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1995 retval.xridx (ii++) = row;\ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1996 Xcol[row] = tmpval * m.data (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1997 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1998 else \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1999 Xcol[row] += tmpval * m.data (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2000 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2001 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2002 sort.sort (ri + retval.xcidx (i), ii - retval.xcidx (i)); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2003 for (octave_idx_type k = retval.xcidx (i); k < ii; k++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2004 retval.xdata (k) = Xcol[retval.xridx (k)]; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2005 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2006 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2007 retval.maybe_compress (true);\ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2008 return retval; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2009 } \ |
5164 | 2010 } |
2011 | |
5681 | 2012 #define SPARSE_FULL_MUL( RET_TYPE, EL_TYPE, ZERO ) \ |
5429 | 2013 octave_idx_type nr = m.rows (); \ |
2014 octave_idx_type nc = m.cols (); \ | |
2015 \ | |
2016 octave_idx_type a_nr = a.rows (); \ | |
2017 octave_idx_type a_nc = a.cols (); \ | |
2018 \ | |
6221 | 2019 if (nr == 1 && nc == 1) \ |
2020 { \ | |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2021 RET_TYPE retval = m.elem (0,0) * a; \ |
6221 | 2022 return retval; \ |
2023 } \ | |
2024 else if (nc != a_nr) \ | |
5429 | 2025 { \ |
2026 gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ | |
2027 return RET_TYPE (); \ | |
2028 } \ | |
2029 else \ | |
2030 { \ | |
5681 | 2031 RET_TYPE retval (nr, a_nc, ZERO); \ |
5429 | 2032 \ |
2033 for (octave_idx_type i = 0; i < a_nc ; i++) \ | |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2034 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2035 for (octave_idx_type j = 0; j < a_nr; j++) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2036 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
2037 octave_quit (); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2038 \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2039 EL_TYPE tmpval = a.elem (j,i); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2040 for (octave_idx_type k = m.cidx (j) ; k < m.cidx (j+1); k++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2041 retval.elem (m.ridx (k),i) += tmpval * m.data (k); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2042 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2043 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2044 return retval; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2045 } |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2046 |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2047 #define SPARSE_FULL_TRANS_MUL( RET_TYPE, EL_TYPE, ZERO, CONJ_OP ) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2048 octave_idx_type nr = m.rows (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2049 octave_idx_type nc = m.cols (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2050 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2051 octave_idx_type a_nr = a.rows (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2052 octave_idx_type a_nc = a.cols (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2053 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2054 if (nr == 1 && nc == 1) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2055 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2056 RET_TYPE retval = CONJ_OP (m.elem (0,0)) * a; \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2057 return retval; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2058 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2059 else if (nr != a_nr) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2060 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2061 gripe_nonconformant ("operator *", nc, nr, a_nr, a_nc); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2062 return RET_TYPE (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2063 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2064 else \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2065 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2066 RET_TYPE retval (nc, a_nc); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2067 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2068 for (octave_idx_type i = 0; i < a_nc ; i++) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2069 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2070 for (octave_idx_type j = 0; j < nc; j++) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2071 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
2072 octave_quit (); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2073 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2074 EL_TYPE acc = ZERO; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2075 for (octave_idx_type k = m.cidx (j) ; k < m.cidx (j+1); k++) \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2076 acc += a.elem (m.ridx (k),i) * CONJ_OP (m.data (k)); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2077 retval.xelem (j,i) = acc; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2078 } \ |
5429 | 2079 } \ |
2080 return retval; \ | |
2081 } | |
2082 | |
5681 | 2083 #define FULL_SPARSE_MUL( RET_TYPE, EL_TYPE, ZERO ) \ |
5429 | 2084 octave_idx_type nr = m.rows (); \ |
2085 octave_idx_type nc = m.cols (); \ | |
2086 \ | |
2087 octave_idx_type a_nr = a.rows (); \ | |
2088 octave_idx_type a_nc = a.cols (); \ | |
2089 \ | |
6221 | 2090 if (a_nr == 1 && a_nc == 1) \ |
2091 { \ | |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2092 RET_TYPE retval = m * a.elem (0,0); \ |
6221 | 2093 return retval; \ |
2094 } \ | |
2095 else if (nc != a_nr) \ | |
5429 | 2096 { \ |
2097 gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ | |
2098 return RET_TYPE (); \ | |
2099 } \ | |
2100 else \ | |
2101 { \ | |
5681 | 2102 RET_TYPE retval (nr, a_nc, ZERO); \ |
5429 | 2103 \ |
2104 for (octave_idx_type i = 0; i < a_nc ; i++) \ | |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2105 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
2106 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2107 for (octave_idx_type j = a.cidx (i); j < a.cidx (i+1); j++) \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2108 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2109 octave_idx_type col = a.ridx (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2110 EL_TYPE tmpval = a.data (j); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2111 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2112 for (octave_idx_type k = 0 ; k < nr; k++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2113 retval.xelem (k,i) += tmpval * m.elem (k,col); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2114 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2115 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2116 return retval; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2117 } |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2118 |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2119 #define FULL_SPARSE_MUL_TRANS( RET_TYPE, EL_TYPE, ZERO, CONJ_OP ) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2120 octave_idx_type nr = m.rows (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2121 octave_idx_type nc = m.cols (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2122 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2123 octave_idx_type a_nr = a.rows (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2124 octave_idx_type a_nc = a.cols (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2125 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2126 if (a_nr == 1 && a_nc == 1) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2127 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2128 RET_TYPE retval = m * CONJ_OP (a.elem (0,0)); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2129 return retval; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2130 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2131 else if (nc != a_nc) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2132 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2133 gripe_nonconformant ("operator *", nr, nc, a_nc, a_nr); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2134 return RET_TYPE (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2135 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2136 else \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2137 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2138 RET_TYPE retval (nr, a_nr, ZERO); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2139 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2140 for (octave_idx_type i = 0; i < a_nc ; i++) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2141 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
2142 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2143 for (octave_idx_type j = a.cidx (i); j < a.cidx (i+1); j++) \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2144 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2145 octave_idx_type col = a.ridx (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2146 EL_TYPE tmpval = CONJ_OP (a.data (j)); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2147 for (octave_idx_type k = 0 ; k < nr; k++) \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2148 retval.xelem (k,col) += tmpval * m.elem (k,i); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2149 } \ |
5429 | 2150 } \ |
2151 return retval; \ | |
2152 } | |
2153 | |
5164 | 2154 #endif |