Mercurial > hg > octave-nkf
annotate liboctave/operators/Sparse-op-defs.h @ 19007:9ac2357f19bc
doc: Replace "non-zero" with "nonzero" to match existing usage.
Replace all occurrences in both documentation and code comments.
* doc/interpreter/contrib.txi, doc/interpreter/diagperm.txi,
doc/interpreter/external.txi, doc/interpreter/sparse.txi,
doc/interpreter/stmt.txi, doc/interpreter/testfun.txi, doc/refcard/refcard.tex,
examples/mysparse.c, libinterp/corefcn/balance.cc,
libinterp/corefcn/cellfun.cc, libinterp/corefcn/data.cc,
libinterp/corefcn/filter.cc, libinterp/corefcn/find.cc,
libinterp/corefcn/kron.cc, libinterp/corefcn/ls-mat5.cc,
libinterp/corefcn/luinc.cc, libinterp/corefcn/mappers.cc,
libinterp/corefcn/oct-fstrm.cc, libinterp/corefcn/oct-fstrm.h,
libinterp/corefcn/oct-iostrm.cc, libinterp/corefcn/oct-iostrm.h,
libinterp/corefcn/oct-stdstrm.h, libinterp/corefcn/oct-strstrm.h,
libinterp/corefcn/spparms.cc, libinterp/corefcn/toplev.cc,
libinterp/corefcn/utils.cc, libinterp/dldfcn/symrcm.cc,
libinterp/octave-value/ov-bool-mat.cc, liboctave/array/CSparse.cc,
liboctave/array/Sparse.cc, liboctave/array/Sparse.h,
liboctave/array/dSparse.cc, liboctave/numeric/randmtzig.c,
liboctave/operators/Sparse-op-defs.h, scripts/help/get_first_help_sentence.m,
scripts/miscellaneous/edit.m, scripts/plot/draw/pie.m,
scripts/plot/draw/pie3.m, scripts/sparse/colperm.m, scripts/sparse/nonzeros.m,
scripts/sparse/spdiags.m, scripts/sparse/spfun.m, scripts/sparse/spones.m,
scripts/sparse/sprand.m, scripts/sparse/sprandn.m, scripts/sparse/sprandsym.m,
scripts/sparse/spstats.m, scripts/sparse/svds.m,
scripts/special-matrix/gallery.m, scripts/statistics/base/moment.m,
scripts/statistics/tests/cor_test.m:
Replace "non-zero" with "nonzero" to match existing usage.
author | Rik <rik@octave.org> |
---|---|
date | Sun, 08 Jun 2014 17:59:59 -0700 |
parents | 6113e0c6920b |
children | 65554f5847ac |
rev | line source |
---|---|
5164 | 1 /* |
2 | |
17744
d63878346099
maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents:
17278
diff
changeset
|
3 Copyright (C) 2004-2013 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 | |
17822
ebb3ef964372
maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents:
17769
diff
changeset
|
25 #if !defined (octave_Sparse_op_defs_h) |
ebb3ef964372
maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents:
17769
diff
changeset
|
26 #define octave_Sparse_op_defs_h 1 |
5164 | 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 \ | |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
459 while (ja_lt_max || jb_lt_max) \ |
5164 | 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 } \ | |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
471 else if ((! ja_lt_max) || \ |
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
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 \ | |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
567 while (ja_lt_max || jb_lt_max) \ |
5164 | 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 } \ | |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
575 else if ((! ja_lt_max) || \ |
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
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 \ | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
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 \ | |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
683 while (ja_lt_max || jb_lt_max) \ |
5164 | 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 } \ | |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
694 else if ((! ja_lt_max) || \ |
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
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. | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
720 // FIXME: Are the NaNs double(NaN) or Complex(NaN,Nan) in the complex case? |
5164 | 721 #define SPARSE_SMSM_BIN_OPS(R1, R2, M1, M2) \ |
722 SPARSE_SMSM_BIN_OP_1 (R1, operator +, +, M1, M2) \ | |
723 SPARSE_SMSM_BIN_OP_1 (R1, operator -, -, M1, M2) \ | |
724 SPARSE_SMSM_BIN_OP_2 (R2, product, *, M1, M2) \ | |
725 SPARSE_SMSM_BIN_OP_3 (R2, quotient, /, M1, M2) | |
726 | |
6708 | 727 #define SPARSE_SMSM_CMP_OP_DECLS(M1, M2, API) \ |
728 SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2, API); \ | |
729 SPARSE_CMP_OP_DECL (mx_el_le, M1, M2, API); \ | |
730 SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2, API); \ | |
731 SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2, API); \ | |
732 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
733 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 734 |
6708 | 735 #define SPARSE_SMSM_EQNE_OP_DECLS(M1, M2, API) \ |
736 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
737 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 738 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
739 // FIXME: this macro duplicates the bodies of the template functions |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
740 // defined in the SPARSE_SSM_CMP_OP and SPARSE_SMS_CMP_OP macros. |
8198 | 741 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
742 #define SPARSE_SMSM_CMP_OP(F, OP, M1, Z1, C1, M2, Z2, C2) \ |
5164 | 743 SparseBoolMatrix \ |
744 F (const M1& m1, const M2& m2) \ | |
745 { \ | |
746 SparseBoolMatrix r; \ | |
747 \ | |
5275 | 748 octave_idx_type m1_nr = m1.rows (); \ |
749 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 750 \ |
5275 | 751 octave_idx_type m2_nr = m2.rows (); \ |
752 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 753 \ |
6221 | 754 if (m1_nr == 1 && m1_nc == 1) \ |
755 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
756 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
|
757 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
758 r = SparseBoolMatrix (m2_nr, m2_nc, true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
759 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
|
760 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
|
761 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
|
762 r.data (m2.ridx (i) + j * m2_nr) = false; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
763 r.maybe_compress (true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
764 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
765 else \ |
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 r = SparseBoolMatrix (m2_nr, m2_nc, m2.nnz ()); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
768 r.cidx (0) = static_cast<octave_idx_type> (0); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
769 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
770 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
|
771 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
772 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
|
773 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
|
774 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
775 r.ridx (nel) = m2.ridx (i); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
776 r.data (nel++) = true; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
777 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
778 r.cidx (j + 1) = nel; \ |
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.maybe_compress (false); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
781 } \ |
6221 | 782 } \ |
783 else if (m2_nr == 1 && m2_nc == 1) \ | |
784 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
785 if (C1 (Z1) OP C2 (m2.elem (0,0))) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
786 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
787 r = SparseBoolMatrix (m1_nr, m1_nc, true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
788 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
|
789 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
|
790 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
|
791 r.data (m1.ridx (i) + j * m1_nr) = false; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
792 r.maybe_compress (true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
793 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
794 else \ |
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 r = SparseBoolMatrix (m1_nr, m1_nc, m1.nnz ()); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
797 r.cidx (0) = static_cast<octave_idx_type> (0); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
798 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
799 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
|
800 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
801 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
|
802 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
|
803 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
804 r.ridx (nel) = m1.ridx (i); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
805 r.data (nel++) = true; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
806 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
807 r.cidx (j + 1) = nel; \ |
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.maybe_compress (false); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
810 } \ |
6221 | 811 } \ |
812 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ | |
5164 | 813 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
814 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
815 { \ |
7269 | 816 if (C1 (Z1) OP C2 (Z2)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
817 { \ |
7269 | 818 r = SparseBoolMatrix (m1_nr, m1_nc, true); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
819 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
7269 | 820 { \ |
821 octave_idx_type i1 = m1.cidx (j); \ | |
822 octave_idx_type e1 = m1.cidx (j+1); \ | |
823 octave_idx_type i2 = m2.cidx (j); \ | |
824 octave_idx_type e2 = m2.cidx (j+1); \ | |
825 while (i1 < e1 || i2 < e2) \ | |
826 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
827 if (i1 == e1 || (i2 < e2 && m1.ridx (i1) > m2.ridx (i2))) \ |
7269 | 828 { \ |
829 if (! (C1 (Z1) OP C2 (m2.data (i2)))) \ | |
830 r.data (m2.ridx (i2) + j * m1_nr) = false; \ | |
831 i2++; \ | |
832 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
833 else if (i2 == e2 || m1.ridx (i1) < m2.ridx (i2)) \ |
7269 | 834 { \ |
835 if (! (C1 (m1.data (i1)) OP C2 (Z2))) \ | |
836 r.data (m1.ridx (i1) + j * m1_nr) = false; \ | |
837 i1++; \ | |
838 } \ | |
839 else \ | |
840 { \ | |
841 if (! (C1 (m1.data (i1)) OP C2 (m2.data (i2)))) \ | |
842 r.data (m1.ridx (i1) + j * m1_nr) = false; \ | |
843 i1++; \ | |
844 i2++; \ | |
845 } \ | |
846 } \ | |
847 } \ | |
848 r.maybe_compress (true); \ | |
849 } \ | |
850 else \ | |
851 { \ | |
852 r = SparseBoolMatrix (m1_nr, m1_nc, m1.nnz () + m2.nnz ()); \ | |
853 r.cidx (0) = static_cast<octave_idx_type> (0); \ | |
854 octave_idx_type nel = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
855 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
7269 | 856 { \ |
857 octave_idx_type i1 = m1.cidx (j); \ | |
858 octave_idx_type e1 = m1.cidx (j+1); \ | |
859 octave_idx_type i2 = m2.cidx (j); \ | |
860 octave_idx_type e2 = m2.cidx (j+1); \ | |
861 while (i1 < e1 || i2 < e2) \ | |
862 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
863 if (i1 == e1 || (i2 < e2 && m1.ridx (i1) > m2.ridx (i2))) \ |
7269 | 864 { \ |
865 if (C1 (Z1) OP C2 (m2.data (i2))) \ | |
866 { \ | |
867 r.ridx (nel) = m2.ridx (i2); \ | |
868 r.data (nel++) = true; \ | |
869 } \ | |
870 i2++; \ | |
871 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
872 else if (i2 == e2 || m1.ridx (i1) < m2.ridx (i2)) \ |
7269 | 873 { \ |
874 if (C1 (m1.data (i1)) OP C2 (Z2)) \ | |
875 { \ | |
876 r.ridx (nel) = m1.ridx (i1); \ | |
877 r.data (nel++) = true; \ | |
878 } \ | |
879 i1++; \ | |
880 } \ | |
881 else \ | |
882 { \ | |
883 if (C1 (m1.data (i1)) OP C2 (m2.data (i2))) \ | |
884 { \ | |
885 r.ridx (nel) = m1.ridx (i1); \ | |
886 r.data (nel++) = true; \ | |
887 } \ | |
888 i1++; \ | |
889 i2++; \ | |
890 } \ | |
891 } \ | |
892 r.cidx (j + 1) = nel; \ | |
893 } \ | |
894 r.maybe_compress (false); \ | |
895 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
896 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
897 } \ |
5164 | 898 else \ |
899 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
900 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
|
901 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 902 } \ |
903 return r; \ | |
904 } | |
905 | |
906 #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
|
907 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
|
908 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
|
909 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
|
910 SPARSE_SMSM_CMP_OP (mx_el_gt, >, M1, Z1, , M2, Z2, ) \ |
7269 | 911 SPARSE_SMSM_CMP_OP (mx_el_eq, ==, M1, Z1, , M2, Z2, ) \ |
912 SPARSE_SMSM_CMP_OP (mx_el_ne, !=, M1, Z1, , M2, Z2, ) | |
5164 | 913 |
914 #define SPARSE_SMSM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
7269 | 915 SPARSE_SMSM_CMP_OP (mx_el_eq, ==, M1, Z1, , M2, Z2, ) \ |
916 SPARSE_SMSM_CMP_OP (mx_el_ne, !=, M1, Z1, , M2, Z2, ) | |
5164 | 917 |
6708 | 918 #define SPARSE_SMSM_BOOL_OP_DECLS(M1, M2, API) \ |
919 SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2, API); \ | |
920 SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2, API); | |
5164 | 921 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
922 // FIXME: this macro duplicates the bodies of the template functions |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
923 // defined in the SPARSE_SSM_BOOL_OP and SPARSE_SMS_BOOL_OP macros. |
8198 | 924 |
5164 | 925 #define SPARSE_SMSM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ |
926 SparseBoolMatrix \ | |
927 F (const M1& m1, const M2& m2) \ | |
928 { \ | |
929 SparseBoolMatrix r; \ | |
930 \ | |
5275 | 931 octave_idx_type m1_nr = m1.rows (); \ |
932 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 933 \ |
5275 | 934 octave_idx_type m2_nr = m2.rows (); \ |
935 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 936 \ |
6221 | 937 if (m1_nr == 1 && m1_nc == 1) \ |
938 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
939 if (m2_nr > 0 && m2_nc > 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
940 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
941 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
|
942 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
943 r = SparseBoolMatrix (m2_nr, m2_nc, true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
944 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
|
945 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
|
946 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
|
947 r.data (m2.ridx (i) + j * m2_nr) = false; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
948 r.maybe_compress (true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
949 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
950 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
951 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
952 r = SparseBoolMatrix (m2_nr, m2_nc, m2.nnz ()); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
953 r.cidx (0) = static_cast<octave_idx_type> (0); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
954 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
955 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
|
956 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
957 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
|
958 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
|
959 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
960 r.ridx (nel) = m2.ridx (i); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
961 r.data (nel++) = true; \ |
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.cidx (j + 1) = nel; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
964 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
965 r.maybe_compress (false); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
966 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
967 } \ |
6221 | 968 } \ |
969 else if (m2_nr == 1 && m2_nc == 1) \ | |
970 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
971 if (m1_nr > 0 && m1_nc > 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
972 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
973 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
|
974 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
975 r = SparseBoolMatrix (m1_nr, m1_nc, true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
976 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
|
977 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
|
978 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
|
979 r.data (m1.ridx (i) + j * m1_nr) = false; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
980 r.maybe_compress (true); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
981 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
982 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
983 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
984 r = SparseBoolMatrix (m1_nr, m1_nc, m1.nnz ()); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
985 r.cidx (0) = static_cast<octave_idx_type> (0); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
986 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
987 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
|
988 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
989 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
|
990 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
|
991 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
992 r.ridx (nel) = m1.ridx (i); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
993 r.data (nel++) = true; \ |
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.cidx (j + 1) = nel; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
996 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
997 r.maybe_compress (false); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
998 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
999 } \ |
6221 | 1000 } \ |
1001 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ | |
5164 | 1002 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1003 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1004 { \ |
7269 | 1005 r = SparseBoolMatrix (m1_nr, m1_nc, m1.nnz () + m2.nnz ()); \ |
1006 r.cidx (0) = static_cast<octave_idx_type> (0); \ | |
1007 octave_idx_type nel = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1008 for (octave_idx_type j = 0; j < m1_nc; j++) \ |
7269 | 1009 { \ |
1010 octave_idx_type i1 = m1.cidx (j); \ | |
1011 octave_idx_type e1 = m1.cidx (j+1); \ | |
1012 octave_idx_type i2 = m2.cidx (j); \ | |
1013 octave_idx_type e2 = m2.cidx (j+1); \ | |
1014 while (i1 < e1 || i2 < e2) \ | |
1015 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1016 if (i1 == e1 || (i2 < e2 && m1.ridx (i1) > m2.ridx (i2))) \ |
7269 | 1017 { \ |
1018 if (LHS_ZERO OP m2.data (i2) != RHS_ZERO) \ | |
1019 { \ | |
1020 r.ridx (nel) = m2.ridx (i2); \ | |
1021 r.data (nel++) = true; \ | |
1022 } \ | |
1023 i2++; \ | |
1024 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1025 else if (i2 == e2 || m1.ridx (i1) < m2.ridx (i2)) \ |
7269 | 1026 { \ |
1027 if (m1.data (i1) != LHS_ZERO OP RHS_ZERO) \ | |
1028 { \ | |
1029 r.ridx (nel) = m1.ridx (i1); \ | |
1030 r.data (nel++) = true; \ | |
1031 } \ | |
1032 i1++; \ | |
1033 } \ | |
1034 else \ | |
1035 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1036 if (m1.data (i1) != LHS_ZERO OP m2.data (i2) != RHS_ZERO) \ |
7269 | 1037 { \ |
1038 r.ridx (nel) = m1.ridx (i1); \ | |
1039 r.data (nel++) = true; \ | |
1040 } \ | |
1041 i1++; \ | |
1042 i2++; \ | |
1043 } \ | |
1044 } \ | |
1045 r.cidx (j + 1) = nel; \ | |
1046 } \ | |
1047 r.maybe_compress (false); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1048 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1049 } \ |
5164 | 1050 else \ |
1051 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1052 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
|
1053 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1054 } \ |
1055 return r; \ | |
1056 } | |
1057 | |
1058 #define SPARSE_SMSM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1059 SPARSE_SMSM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1060 SPARSE_SMSM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1061 | |
1062 #define SPARSE_SMSM_BOOL_OPS(M1, M2, ZERO) \ | |
1063 SPARSE_SMSM_BOOL_OPS2(M1, M2, ZERO, ZERO) | |
1064 | |
6708 | 1065 #define SPARSE_SMSM_OP_DECLS(R1, R2, M1, M2, API) \ |
1066 SPARSE_SMSM_BIN_OP_DECLS (R1, R2, M1, M2, API) \ | |
1067 SPARSE_SMSM_CMP_OP_DECLS (M1, M2, API) \ | |
1068 SPARSE_SMSM_BOOL_OP_DECLS (M1, M2, API) | |
5164 | 1069 |
1070 // matrix by matrix operations. | |
1071 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1072 #define SPARSE_MSM_BIN_OP_DECLS(R1, R2, M1, M2, API) \ |
6708 | 1073 SPARSE_BIN_OP_DECL (R1, operator +, M1, M2, API); \ |
1074 SPARSE_BIN_OP_DECL (R1, operator -, M1, M2, API); \ | |
1075 SPARSE_BIN_OP_DECL (R2, product, M1, M2, API); \ | |
1076 SPARSE_BIN_OP_DECL (R2, quotient, M1, M2, API); | |
5164 | 1077 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1078 #define SPARSE_MSM_BIN_OP_1(R, F, OP, M1, M2) \ |
5164 | 1079 R \ |
1080 F (const M1& m1, const M2& m2) \ | |
1081 { \ | |
1082 R r; \ | |
1083 \ | |
5275 | 1084 octave_idx_type m1_nr = m1.rows (); \ |
1085 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1086 \ |
5275 | 1087 octave_idx_type m2_nr = m2.rows (); \ |
1088 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1089 \ |
6221 | 1090 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
|
1091 r = R (m1 OP m2.elem (0,0)); \ |
6221 | 1092 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ |
5164 | 1093 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
1094 else \ | |
1095 { \ | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1096 r = R (F (m1, m2.matrix_value ())); \ |
5164 | 1097 } \ |
1098 return r; \ | |
1099 } | |
1100 | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1101 #define SPARSE_MSM_BIN_OP_2(R, F, OP, M1, M2) \ |
5164 | 1102 R \ |
1103 F (const M1& m1, const M2& m2) \ | |
1104 { \ | |
1105 R r; \ | |
1106 \ | |
5275 | 1107 octave_idx_type m1_nr = m1.rows (); \ |
1108 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1109 \ |
5275 | 1110 octave_idx_type m2_nr = m2.rows (); \ |
1111 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1112 \ |
6221 | 1113 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
|
1114 r = R (m1 OP m2.elem (0,0)); \ |
6221 | 1115 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ |
5164 | 1116 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
1117 else \ | |
1118 { \ | |
13731
3b52038e6e6c
Help dumb compilers to resolve template parameters.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
11523
diff
changeset
|
1119 if (do_mx_check (m1, mx_inline_all_finite<M1::element_type>)) \ |
5164 | 1120 { \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1121 /* Sparsity pattern is preserved. */ \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1122 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
|
1123 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
|
1124 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
|
1125 { \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1126 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1127 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
|
1128 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1129 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
|
1130 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
|
1131 if (x != 0.0) \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1132 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1133 r.xdata (k) = x; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1134 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
|
1135 k++; \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1136 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1137 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1138 r.xcidx (j+1) = k; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1139 } \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1140 r.maybe_compress (false); \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1141 return r; \ |
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 else \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1144 r = R (F (m1, m2.matrix_value ())); \ |
5164 | 1145 } \ |
1146 \ | |
1147 return r; \ | |
1148 } | |
1149 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
1150 // FIXME: Pass a specific ZERO value |
5164 | 1151 #define SPARSE_MSM_BIN_OPS(R1, R2, M1, M2) \ |
1152 SPARSE_MSM_BIN_OP_1 (R1, operator +, +, M1, M2) \ | |
1153 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
|
1154 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
|
1155 SPARSE_MSM_BIN_OP_1 (R2, quotient, /, M1, M2) |
5164 | 1156 |
6708 | 1157 #define SPARSE_MSM_CMP_OP_DECLS(M1, M2, API) \ |
1158 SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2, API); \ | |
1159 SPARSE_CMP_OP_DECL (mx_el_le, M1, M2, API); \ | |
1160 SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2, API); \ | |
1161 SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2, API); \ | |
1162 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
1163 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 1164 |
6708 | 1165 #define SPARSE_MSM_EQNE_OP_DECLS(M1, M2, API) \ |
1166 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
1167 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 1168 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1169 #define SPARSE_MSM_CMP_OP(F, OP, M1, C1, M2, C2) \ |
5164 | 1170 SparseBoolMatrix \ |
1171 F (const M1& m1, const M2& m2) \ | |
1172 { \ | |
1173 SparseBoolMatrix r; \ | |
1174 \ | |
5275 | 1175 octave_idx_type m1_nr = m1.rows (); \ |
1176 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1177 \ |
5275 | 1178 octave_idx_type m2_nr = m2.rows (); \ |
1179 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1180 \ |
6221 | 1181 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
|
1182 r = SparseBoolMatrix (F (m1, m2.elem (0,0))); \ |
6221 | 1183 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ |
5164 | 1184 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1185 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1186 { \ |
19007
9ac2357f19bc
doc: Replace "non-zero" with "nonzero" to match existing usage.
Rik <rik@octave.org>
parents:
18833
diff
changeset
|
1187 /* Count num of nonzero elements */ \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1188 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1189 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
|
1190 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
|
1191 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
|
1192 nel++; \ |
5164 | 1193 \ |
1194 r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ | |
1195 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1196 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1197 r.cidx (0) = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1198 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
|
1199 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1200 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
|
1201 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1202 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
|
1203 if (el) \ |
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 r.data (ii) = el; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1206 r.ridx (ii++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1207 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1208 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1209 r.cidx (j+1) = ii; \ |
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 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1212 } \ |
5164 | 1213 else \ |
1214 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1215 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
|
1216 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1217 } \ |
1218 return r; \ | |
1219 } | |
1220 | |
1221 #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
|
1222 SPARSE_MSM_CMP_OP (mx_el_lt, <, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1223 SPARSE_MSM_CMP_OP (mx_el_le, <=, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1224 SPARSE_MSM_CMP_OP (mx_el_ge, >=, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1225 SPARSE_MSM_CMP_OP (mx_el_gt, >, M1, , M2, ) \ |
5164 | 1226 SPARSE_MSM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ |
1227 SPARSE_MSM_CMP_OP (mx_el_ne, !=, M1, , M2, ) | |
1228 | |
1229 #define SPARSE_MSM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
1230 SPARSE_MSM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ | |
1231 SPARSE_MSM_CMP_OP (mx_el_ne, !=, M1, , M2, ) | |
1232 | |
6708 | 1233 #define SPARSE_MSM_BOOL_OP_DECLS(M1, M2, API) \ |
1234 SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2, API); \ | |
1235 SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2, API); | |
5164 | 1236 |
1237 #define SPARSE_MSM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1238 SparseBoolMatrix \ | |
1239 F (const M1& m1, const M2& m2) \ | |
1240 { \ | |
1241 SparseBoolMatrix r; \ | |
1242 \ | |
5275 | 1243 octave_idx_type m1_nr = m1.rows (); \ |
1244 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1245 \ |
5275 | 1246 octave_idx_type m2_nr = m2.rows (); \ |
1247 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1248 \ |
6221 | 1249 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
|
1250 r = SparseBoolMatrix (F (m1, m2.elem (0,0))); \ |
6221 | 1251 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ |
5164 | 1252 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1253 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1254 { \ |
19007
9ac2357f19bc
doc: Replace "non-zero" with "nonzero" to match existing usage.
Rik <rik@octave.org>
parents:
18833
diff
changeset
|
1255 /* Count num of nonzero elements */ \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1256 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1257 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
|
1258 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
|
1259 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
|
1260 OP (m2.elem (i, j) != RHS_ZERO)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1261 nel++; \ |
5164 | 1262 \ |
1263 r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ | |
1264 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1265 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1266 r.cidx (0) = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1267 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
|
1268 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1269 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
|
1270 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1271 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
|
1272 OP (m2.elem (i, j) != RHS_ZERO); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1273 if (el) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1274 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1275 r.data (ii) = el; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1276 r.ridx (ii++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1277 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1278 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1279 r.cidx (j+1) = ii; \ |
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 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1282 } \ |
5164 | 1283 else \ |
1284 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1285 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
|
1286 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1287 } \ |
1288 return r; \ | |
1289 } | |
1290 | |
1291 #define SPARSE_MSM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1292 SPARSE_MSM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1293 SPARSE_MSM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1294 | |
1295 #define SPARSE_MSM_BOOL_OPS(M1, M2, ZERO) \ | |
1296 SPARSE_MSM_BOOL_OPS2(M1, M2, ZERO, ZERO) | |
1297 | |
6708 | 1298 #define SPARSE_MSM_OP_DECLS(R1, R2, M1, M2, API) \ |
1299 SPARSE_MSM_BIN_OP_DECLS (R1, R2, M1, M2, API) \ | |
1300 SPARSE_MSM_CMP_OP_DECLS (M1, M2, API) \ | |
1301 SPARSE_MSM_BOOL_OP_DECLS (M1, M2, API) | |
5164 | 1302 |
1303 // matrix by matrix operations. | |
1304 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1305 #define SPARSE_SMM_BIN_OP_DECLS(R1, R2, M1, M2, API) \ |
6708 | 1306 SPARSE_BIN_OP_DECL (R1, operator +, M1, M2, API); \ |
1307 SPARSE_BIN_OP_DECL (R1, operator -, M1, M2, API); \ | |
1308 SPARSE_BIN_OP_DECL (R2, product, M1, M2, API); \ | |
1309 SPARSE_BIN_OP_DECL (R2, quotient, M1, M2, API); | |
5164 | 1310 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1311 #define SPARSE_SMM_BIN_OP_1(R, F, OP, M1, M2) \ |
5164 | 1312 R \ |
1313 F (const M1& m1, const M2& m2) \ | |
1314 { \ | |
1315 R r; \ | |
1316 \ | |
5275 | 1317 octave_idx_type m1_nr = m1.rows (); \ |
1318 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1319 \ |
5275 | 1320 octave_idx_type m2_nr = m2.rows (); \ |
1321 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1322 \ |
6221 | 1323 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
|
1324 r = R (m1.elem (0,0) OP m2); \ |
6221 | 1325 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ |
5164 | 1326 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
1327 else \ | |
1328 { \ | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1329 r = R (m1.matrix_value () OP m2); \ |
5164 | 1330 } \ |
1331 return r; \ | |
1332 } | |
1333 | |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1334 // 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
|
1335 #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
|
1336 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
|
1337 |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1338 // 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
|
1339 #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
|
1340 ! 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
|
1341 |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1342 #define SPARSE_SMM_BIN_OP_2(R, F, OP, M1, M2) \ |
5164 | 1343 R \ |
1344 F (const M1& m1, const M2& m2) \ | |
1345 { \ | |
1346 R r; \ | |
1347 \ | |
5275 | 1348 octave_idx_type m1_nr = m1.rows (); \ |
1349 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1350 \ |
5275 | 1351 octave_idx_type m2_nr = m2.rows (); \ |
1352 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1353 \ |
6221 | 1354 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
|
1355 r = R (m1.elem (0,0) OP m2); \ |
6221 | 1356 else if (m1_nr != m2_nr || m1_nc != m2_nc) \ |
5164 | 1357 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
1358 else \ | |
1359 { \ | |
13731
3b52038e6e6c
Help dumb compilers to resolve template parameters.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
11523
diff
changeset
|
1360 if (SPARSE_SMM_BIN_OP_2_CHECK_ ## F(M2::element_type)) \ |
5164 | 1361 { \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1362 /* Sparsity pattern is preserved. */ \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1363 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
|
1364 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
|
1365 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
|
1366 { \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1367 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1368 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
|
1369 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1370 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
|
1371 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
|
1372 if (x != 0.0) \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1373 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1374 r.xdata (k) = x; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1375 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
|
1376 k++; \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1377 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1378 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1379 r.xcidx (j+1) = k; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1380 } \ |
10900
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1381 r.maybe_compress (false); \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1382 return r; \ |
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 else \ |
b64803a8be4e
optimize element-wise sparse-dense multiplication and division
Jaroslav Hajek <highegg@gmail.com>
parents:
10312
diff
changeset
|
1385 r = R (F (m1.matrix_value (), m2)); \ |
5164 | 1386 } \ |
1387 \ | |
1388 return r; \ | |
1389 } | |
1390 | |
1391 #define SPARSE_SMM_BIN_OPS(R1, R2, M1, M2) \ | |
1392 SPARSE_SMM_BIN_OP_1 (R1, operator +, +, M1, M2) \ | |
1393 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
|
1394 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
|
1395 SPARSE_SMM_BIN_OP_2 (R2, quotient, /, M1, M2) |
5164 | 1396 |
6708 | 1397 #define SPARSE_SMM_CMP_OP_DECLS(M1, M2, API) \ |
1398 SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2, API); \ | |
1399 SPARSE_CMP_OP_DECL (mx_el_le, M1, M2, API); \ | |
1400 SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2, API); \ | |
1401 SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2, API); \ | |
1402 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
1403 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 1404 |
6708 | 1405 #define SPARSE_SMM_EQNE_OP_DECLS(M1, M2, API) \ |
1406 SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2, API); \ | |
1407 SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2, API); | |
5164 | 1408 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1409 #define SPARSE_SMM_CMP_OP(F, OP, M1, C1, M2, C2) \ |
5164 | 1410 SparseBoolMatrix \ |
1411 F (const M1& m1, const M2& m2) \ | |
1412 { \ | |
1413 SparseBoolMatrix r; \ | |
1414 \ | |
5275 | 1415 octave_idx_type m1_nr = m1.rows (); \ |
1416 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1417 \ |
5275 | 1418 octave_idx_type m2_nr = m2.rows (); \ |
1419 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1420 \ |
6221 | 1421 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
|
1422 r = SparseBoolMatrix (F (m1.elem (0,0), m2)); \ |
6221 | 1423 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ |
5164 | 1424 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1425 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1426 { \ |
19007
9ac2357f19bc
doc: Replace "non-zero" with "nonzero" to match existing usage.
Rik <rik@octave.org>
parents:
18833
diff
changeset
|
1427 /* Count num of nonzero elements */ \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1428 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1429 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
|
1430 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
|
1431 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
|
1432 nel++; \ |
5164 | 1433 \ |
1434 r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ | |
1435 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1436 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1437 r.cidx (0) = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1438 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
|
1439 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1440 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
|
1441 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1442 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
|
1443 if (el) \ |
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 r.data (ii) = el; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1446 r.ridx (ii++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1447 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1448 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1449 r.cidx (j+1) = ii; \ |
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 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1452 } \ |
5164 | 1453 else \ |
1454 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1455 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
|
1456 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1457 } \ |
1458 return r; \ | |
1459 } | |
1460 | |
1461 #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
|
1462 SPARSE_SMM_CMP_OP (mx_el_lt, <, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1463 SPARSE_SMM_CMP_OP (mx_el_le, <=, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1464 SPARSE_SMM_CMP_OP (mx_el_ge, >=, M1, , M2, ) \ |
7dafdb8b062f
refactor comparison ops implementations
Jaroslav Hajek <highegg@gmail.com>
parents:
9417
diff
changeset
|
1465 SPARSE_SMM_CMP_OP (mx_el_gt, >, M1, , M2, ) \ |
5164 | 1466 SPARSE_SMM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ |
1467 SPARSE_SMM_CMP_OP (mx_el_ne, !=, M1, , M2, ) | |
1468 | |
1469 #define SPARSE_SMM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ | |
1470 SPARSE_SMM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ | |
1471 SPARSE_SMM_CMP_OP (mx_el_ne, !=, M1, , M2, ) | |
1472 | |
6708 | 1473 #define SPARSE_SMM_BOOL_OP_DECLS(M1, M2, API) \ |
1474 SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2, API); \ | |
1475 SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2, API); | |
5164 | 1476 |
1477 #define SPARSE_SMM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1478 SparseBoolMatrix \ | |
1479 F (const M1& m1, const M2& m2) \ | |
1480 { \ | |
1481 SparseBoolMatrix r; \ | |
1482 \ | |
5275 | 1483 octave_idx_type m1_nr = m1.rows (); \ |
1484 octave_idx_type m1_nc = m1.cols (); \ | |
5164 | 1485 \ |
5275 | 1486 octave_idx_type m2_nr = m2.rows (); \ |
1487 octave_idx_type m2_nc = m2.cols (); \ | |
5164 | 1488 \ |
6221 | 1489 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
|
1490 r = SparseBoolMatrix (F (m1.elem (0,0), m2)); \ |
6221 | 1491 else if (m1_nr == m2_nr && m1_nc == m2_nc) \ |
5164 | 1492 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1493 if (m1_nr != 0 || m1_nc != 0) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1494 { \ |
19007
9ac2357f19bc
doc: Replace "non-zero" with "nonzero" to match existing usage.
Rik <rik@octave.org>
parents:
18833
diff
changeset
|
1495 /* Count num of nonzero elements */ \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1496 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1497 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
|
1498 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
|
1499 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
|
1500 OP (m2.elem (i, j) != RHS_ZERO)) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1501 nel++; \ |
5164 | 1502 \ |
1503 r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ | |
1504 \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1505 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1506 r.cidx (0) = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1507 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
|
1508 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1509 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
|
1510 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1511 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
|
1512 OP (m2.elem (i, j) != RHS_ZERO); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1513 if (el) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1514 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1515 r.data (ii) = el; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1516 r.ridx (ii++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1517 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1518 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1519 r.cidx (j+1) = ii; \ |
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 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1522 } \ |
5164 | 1523 else \ |
1524 { \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1525 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
|
1526 gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ |
5164 | 1527 } \ |
1528 return r; \ | |
1529 } | |
1530 | |
1531 #define SPARSE_SMM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1532 SPARSE_SMM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1533 SPARSE_SMM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ | |
1534 | |
1535 #define SPARSE_SMM_BOOL_OPS(M1, M2, ZERO) \ | |
1536 SPARSE_SMM_BOOL_OPS2(M1, M2, ZERO, ZERO) | |
1537 | |
6708 | 1538 #define SPARSE_SMM_OP_DECLS(R1, R2, M1, M2, API) \ |
1539 SPARSE_SMM_BIN_OP_DECLS (R1, R2, M1, M2, API) \ | |
1540 SPARSE_SMM_CMP_OP_DECLS (M1, M2, API) \ | |
1541 SPARSE_SMM_BOOL_OP_DECLS (M1, M2, API) | |
5164 | 1542 |
1543 // Avoid some code duplication. Maybe we should use templates. | |
1544 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1545 #define SPARSE_CUMSUM(RET_TYPE, ELT_TYPE, FCN) \ |
5164 | 1546 \ |
5275 | 1547 octave_idx_type nr = rows (); \ |
1548 octave_idx_type nc = cols (); \ | |
5164 | 1549 \ |
1550 RET_TYPE retval; \ | |
1551 \ | |
1552 if (nr > 0 && nc > 0) \ | |
1553 { \ | |
1554 if ((nr == 1 && dim == -1) || dim == 1) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1555 /* Ugly!! Is there a better way? */ \ |
5164 | 1556 retval = transpose (). FCN (0) .transpose (); \ |
1557 else \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1558 { \ |
5275 | 1559 octave_idx_type nel = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1560 for (octave_idx_type i = 0; i < nc; i++) \ |
5164 | 1561 { \ |
1562 ELT_TYPE t = ELT_TYPE (); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1563 for (octave_idx_type j = cidx (i); j < cidx (i+1); j++) \ |
5164 | 1564 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1565 t += data (j); \ |
5164 | 1566 if (t != ELT_TYPE ()) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1567 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1568 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
|
1569 nel += nr - ridx (j); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1570 else \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1571 nel += ridx (j+1) - ridx (j); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1572 } \ |
5164 | 1573 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1574 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1575 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
|
1576 retval.cidx (0) = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1577 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1578 for (octave_idx_type i = 0; i < nc; i++) \ |
5164 | 1579 { \ |
1580 ELT_TYPE t = ELT_TYPE (); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1581 for (octave_idx_type j = cidx (i); j < cidx (i+1); j++) \ |
5164 | 1582 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1583 t += data (j); \ |
5164 | 1584 if (t != ELT_TYPE ()) \ |
1585 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1586 if (j == cidx (i+1) - 1) \ |
5164 | 1587 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1588 for (octave_idx_type k = ridx (j); k < nr; k++) \ |
5164 | 1589 { \ |
1590 retval.data (ii) = t; \ | |
1591 retval.ridx (ii++) = k; \ | |
1592 } \ | |
1593 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1594 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1595 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1596 for (octave_idx_type k = ridx (j); k < ridx (j+1); k++) \ |
5164 | 1597 { \ |
1598 retval.data (ii) = t; \ | |
1599 retval.ridx (ii++) = k; \ | |
1600 } \ | |
1601 } \ | |
1602 } \ | |
1603 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1604 retval.cidx (i+1) = ii; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1605 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1606 } \ |
5164 | 1607 } \ |
1608 else \ | |
1609 retval = RET_TYPE (nr,nc); \ | |
1610 \ | |
1611 return retval | |
1612 | |
1613 | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1614 #define SPARSE_CUMPROD(RET_TYPE, ELT_TYPE, FCN) \ |
5164 | 1615 \ |
5275 | 1616 octave_idx_type nr = rows (); \ |
1617 octave_idx_type nc = cols (); \ | |
5164 | 1618 \ |
1619 RET_TYPE retval; \ | |
1620 \ | |
1621 if (nr > 0 && nc > 0) \ | |
1622 { \ | |
1623 if ((nr == 1 && dim == -1) || dim == 1) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1624 /* Ugly!! Is there a better way? */ \ |
5164 | 1625 retval = transpose (). FCN (0) .transpose (); \ |
1626 else \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1627 { \ |
5275 | 1628 octave_idx_type nel = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1629 for (octave_idx_type i = 0; i < nc; i++) \ |
5164 | 1630 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1631 octave_idx_type jj = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1632 for (octave_idx_type j = cidx (i); j < cidx (i+1); j++) \ |
5164 | 1633 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1634 if (jj == ridx (j)) \ |
5164 | 1635 { \ |
1636 nel++; \ | |
1637 jj++; \ | |
1638 } \ | |
1639 else \ | |
1640 break; \ | |
1641 } \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1642 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1643 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
|
1644 retval.cidx (0) = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1645 octave_idx_type ii = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1646 for (octave_idx_type i = 0; i < nc; i++) \ |
5164 | 1647 { \ |
1648 ELT_TYPE t = ELT_TYPE (1.); \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1649 octave_idx_type jj = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1650 for (octave_idx_type j = cidx (i); j < cidx (i+1); j++) \ |
5164 | 1651 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1652 if (jj == ridx (j)) \ |
5164 | 1653 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1654 t *= data (j); \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1655 retval.data (ii) = t; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1656 retval.ridx (ii++) = jj++; \ |
5164 | 1657 } \ |
1658 else \ | |
1659 break; \ | |
1660 } \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1661 retval.cidx (i+1) = ii; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1662 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1663 } \ |
5164 | 1664 } \ |
1665 else \ | |
1666 retval = RET_TYPE (nr,nc); \ | |
1667 \ | |
1668 return retval | |
1669 | |
1670 #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
|
1671 INIT_VAL, MT_RESULT) \ |
5164 | 1672 \ |
5275 | 1673 octave_idx_type nr = rows (); \ |
1674 octave_idx_type nc = cols (); \ | |
5164 | 1675 \ |
1676 RET_TYPE retval; \ | |
1677 \ | |
1678 if (nr > 0 && nc > 0) \ | |
1679 { \ | |
1680 if ((nr == 1 && dim == -1) || dim == 1) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1681 { \ |
7269 | 1682 /* Define j here to allow fancy definition for prod method */ \ |
1683 octave_idx_type j = 0; \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1684 OCTAVE_LOCAL_BUFFER (EL_TYPE, tmp, nr); \ |
5164 | 1685 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1686 for (octave_idx_type i = 0; i < nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1687 tmp[i] = INIT_VAL; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1688 for (j = 0; j < nc; j++) \ |
7269 | 1689 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1690 for (octave_idx_type i = cidx (j); i < cidx (j + 1); i++) \ |
7269 | 1691 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1692 ROW_EXPR; \ |
7269 | 1693 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1694 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1695 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1696 for (octave_idx_type i = 0; i < nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1697 if (tmp[i] != EL_TYPE ()) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1698 nel++ ; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1699 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
|
1700 retval.cidx (0) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1701 retval.cidx (1) = nel; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1702 nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1703 for (octave_idx_type i = 0; i < nr; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1704 if (tmp[i] != EL_TYPE ()) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1705 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1706 retval.data (nel) = tmp[i]; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1707 retval.ridx (nel++) = i; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1708 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1709 } \ |
5164 | 1710 else \ |
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 OCTAVE_LOCAL_BUFFER (EL_TYPE, tmp, nc); \ |
5164 | 1713 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1714 for (octave_idx_type j = 0; j < nc; j++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1715 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1716 tmp[j] = INIT_VAL; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1717 for (octave_idx_type i = cidx (j); i < cidx (j + 1); i++) \ |
7269 | 1718 { \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1719 COL_EXPR; \ |
7269 | 1720 } \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1721 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1722 octave_idx_type nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1723 for (octave_idx_type i = 0; i < nc; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1724 if (tmp[i] != EL_TYPE ()) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1725 nel++ ; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1726 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
|
1727 retval.cidx (0) = 0; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1728 nel = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1729 for (octave_idx_type i = 0; i < nc; i++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1730 if (tmp[i] != EL_TYPE ()) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1731 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1732 retval.data (nel) = tmp[i]; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1733 retval.ridx (nel++) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1734 retval.cidx (i+1) = retval.cidx (i) + 1; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1735 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1736 else \ |
15018
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); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1738 } \ |
5164 | 1739 } \ |
1740 else if (nc == 0 && (nr == 0 || (nr == 1 && dim == -1))) \ | |
1741 { \ | |
7197 | 1742 if (MT_RESULT) \ |
1743 { \ | |
1744 retval = RET_TYPE (static_cast<octave_idx_type> (1), \ | |
1745 static_cast<octave_idx_type> (1), \ | |
1746 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
|
1747 retval.cidx (0) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1748 retval.cidx (1) = 1; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1749 retval.ridx (0) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1750 retval.data (0) = MT_RESULT; \ |
7197 | 1751 } \ |
1752 else \ | |
1753 retval = RET_TYPE (static_cast<octave_idx_type> (1), \ | |
1754 static_cast<octave_idx_type> (1), \ | |
1755 static_cast<octave_idx_type> (0)); \ | |
5164 | 1756 } \ |
1757 else if (nr == 0 && (dim == 0 || dim == -1)) \ | |
1758 { \ | |
7197 | 1759 if (MT_RESULT) \ |
5164 | 1760 { \ |
7197 | 1761 retval = RET_TYPE (static_cast<octave_idx_type> (1), nc, nc); \ |
1762 retval.cidx (0) = 0; \ | |
1763 for (octave_idx_type i = 0; i < nc ; i++) \ | |
1764 { \ | |
1765 retval.ridx (i) = 0; \ | |
17278
79d4b6089968
Fix isequal for sparse matrix (bug #37321)
Stefan Mahr <dac922@gmx.de>
parents:
15271
diff
changeset
|
1766 retval.cidx (i+1) = i+1; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1767 retval.data (i) = MT_RESULT; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1768 } \ |
7197 | 1769 } \ |
1770 else \ | |
1771 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
|
1772 static_cast<octave_idx_type> (0)); \ |
5164 | 1773 } \ |
1774 else if (nc == 0 && dim == 1) \ | |
1775 { \ | |
7197 | 1776 if (MT_RESULT) \ |
1777 { \ | |
1778 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
|
1779 retval.cidx (0) = 0; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1780 retval.cidx (1) = nr; \ |
7197 | 1781 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
|
1782 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1783 retval.ridx (i) = i; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1784 retval.data (i) = MT_RESULT; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1785 } \ |
7197 | 1786 } \ |
1787 else \ | |
1788 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
|
1789 static_cast<octave_idx_type> (0)); \ |
5164 | 1790 } \ |
1791 else \ | |
1792 retval.resize (nr > 0, nc > 0); \ | |
1793 \ | |
1794 return retval | |
1795 | |
1796 #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
|
1797 tmp[ridx (i)] OP data (i) |
5164 | 1798 |
1799 #define SPARSE_REDUCTION_OP_COL_EXPR(OP) \ | |
7269 | 1800 tmp[j] OP data (i) |
5164 | 1801 |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1802 #define SPARSE_REDUCTION_OP(RET_TYPE, EL_TYPE, OP, INIT_VAL, MT_RESULT) \ |
5164 | 1803 SPARSE_BASE_REDUCTION_OP (RET_TYPE, EL_TYPE, \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1804 SPARSE_REDUCTION_OP_ROW_EXPR (OP), \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1805 SPARSE_REDUCTION_OP_COL_EXPR (OP), \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1806 INIT_VAL, MT_RESULT) |
5164 | 1807 |
7350 | 1808 |
1809 // Don't break from this loop if the test succeeds because | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
1810 // we are looping over the rows and not the columns in the inner loop. |
5164 | 1811 #define SPARSE_ANY_ALL_OP_ROW_CODE(TEST_OP, TEST_TRUE_VAL) \ |
7269 | 1812 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
|
1813 tmp[ridx (i)] = TEST_TRUE_VAL; \ |
5164 | 1814 |
1815 #define SPARSE_ANY_ALL_OP_COL_CODE(TEST_OP, TEST_TRUE_VAL) \ | |
7269 | 1816 if (data (i) TEST_OP 0.0) \ |
5164 | 1817 { \ |
1818 tmp[j] = TEST_TRUE_VAL; \ | |
1819 break; \ | |
1820 } | |
1821 | |
7269 | 1822 #define SPARSE_ANY_ALL_OP(DIM, INIT_VAL, MT_RESULT, TEST_OP, TEST_TRUE_VAL) \ |
5164 | 1823 SPARSE_BASE_REDUCTION_OP (SparseBoolMatrix, char, \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1824 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
|
1825 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
|
1826 INIT_VAL, MT_RESULT) |
5164 | 1827 |
7269 | 1828 #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
|
1829 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
|
1830 return transpose (). all (0). transpose (); \ |
7269 | 1831 else \ |
1832 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1833 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
|
1834 true, ==, false); \ |
7269 | 1835 } |
5164 | 1836 |
7269 | 1837 #define SPARSE_ANY_OP(DIM) SPARSE_ANY_ALL_OP (DIM, false, false, !=, true) |
5164 | 1838 |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
1839 #define SPARSE_SPARSE_MUL(RET_TYPE, RET_EL_TYPE, EL_TYPE) \ |
5275 | 1840 octave_idx_type nr = m.rows (); \ |
1841 octave_idx_type nc = m.cols (); \ | |
5164 | 1842 \ |
5275 | 1843 octave_idx_type a_nr = a.rows (); \ |
1844 octave_idx_type a_nc = a.cols (); \ | |
5164 | 1845 \ |
6221 | 1846 if (nr == 1 && nc == 1) \ |
1847 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1848 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
|
1849 octave_idx_type nz = a.nnz (); \ |
6221 | 1850 RET_TYPE r (a_nr, a_nc, nz); \ |
1851 \ | |
1852 for (octave_idx_type i = 0; i < nz; i++) \ | |
1853 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
1854 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1855 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
|
1856 r.ridx (i) = a.ridx (i); \ |
6221 | 1857 } \ |
1858 for (octave_idx_type i = 0; i < a_nc + 1; i++) \ | |
1859 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
1860 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1861 r.cidx (i) = a.cidx (i); \ |
6221 | 1862 } \ |
1863 \ | |
1864 r.maybe_compress (true); \ | |
1865 return r; \ | |
1866 } \ | |
1867 else if (a_nr == 1 && a_nc == 1) \ | |
1868 { \ | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1869 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
|
1870 octave_idx_type nz = m.nnz (); \ |
6221 | 1871 RET_TYPE r (nr, nc, nz); \ |
1872 \ | |
1873 for (octave_idx_type i = 0; i < nz; i++) \ | |
1874 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
1875 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1876 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
|
1877 r.ridx (i) = m.ridx (i); \ |
6221 | 1878 } \ |
1879 for (octave_idx_type i = 0; i < nc + 1; i++) \ | |
1880 { \ | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
1881 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1882 r.cidx (i) = m.cidx (i); \ |
6221 | 1883 } \ |
1884 \ | |
1885 r.maybe_compress (true); \ | |
1886 return r; \ | |
1887 } \ | |
1888 else if (nc != a_nr) \ | |
5164 | 1889 { \ |
1890 gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ | |
1891 return RET_TYPE (); \ | |
1892 } \ | |
1893 else \ | |
1894 { \ | |
5586 | 1895 OCTAVE_LOCAL_BUFFER (octave_idx_type, w, nr); \ |
5876 | 1896 RET_TYPE retval (nr, a_nc, static_cast<octave_idx_type> (0)); \ |
5586 | 1897 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
|
1898 w[i] = 0; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1899 retval.xcidx (0) = 0; \ |
5164 | 1900 \ |
5275 | 1901 octave_idx_type nel = 0; \ |
5164 | 1902 \ |
5275 | 1903 for (octave_idx_type i = 0; i < a_nc; i++) \ |
5164 | 1904 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1905 for (octave_idx_type j = a.cidx (i); j < a.cidx (i+1); j++) \ |
5164 | 1906 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1907 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
|
1908 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
|
1909 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1910 if (w[m.ridx (k)] < i + 1) \ |
5586 | 1911 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1912 w[m.ridx (k)] = i + 1; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1913 nel++; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1914 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1915 octave_quit (); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1916 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1917 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1918 retval.xcidx (i+1) = nel; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1919 } \ |
5164 | 1920 \ |
1921 if (nel == 0) \ | |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1922 return RET_TYPE (nr, a_nc); \ |
5164 | 1923 else \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1924 { \ |
5586 | 1925 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
|
1926 w[i] = 0; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1927 \ |
5681 | 1928 OCTAVE_LOCAL_BUFFER (RET_EL_TYPE, Xcol, nr); \ |
5586 | 1929 \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1930 retval.change_capacity (nel); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1931 /* The optimal break-point as estimated from simulations */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1932 /* Note that Mergesort is O(nz log(nz)) while searching all */ \ |
19007
9ac2357f19bc
doc: Replace "non-zero" with "nonzero" to match existing usage.
Rik <rik@octave.org>
parents:
18833
diff
changeset
|
1933 /* values is O(nr), where nz here is nonzero per row of */ \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1934 /* 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
|
1935 /* simulation with random square matrices and the observation */ \ |
19007
9ac2357f19bc
doc: Replace "non-zero" with "nonzero" to match existing usage.
Rik <rik@octave.org>
parents:
18833
diff
changeset
|
1936 /* of the number of nonzero elements in the output matrix */ \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1937 /* it was found that the breakpoints were */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1938 /* nr: 500 1000 2000 5000 10000 */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1939 /* nz: 6 25 97 585 2202 */ \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1940 /* 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
|
1941 /* to these breakpoints */ \ |
5795 | 1942 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
|
1943 (a_nc * a_nc) / 43000); \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1944 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
|
1945 octave_idx_type *ri = retval.xridx (); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1946 octave_sort<octave_idx_type> sort; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1947 \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1948 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
|
1949 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1950 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
|
1951 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1952 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
|
1953 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1954 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
|
1955 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
|
1956 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
|
1957 k < m.cidx (col+1); k++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1958 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1959 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1960 octave_idx_type row = m.ridx (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1961 if (w[row] < i + 1) \ |
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 w[row] = i + 1; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1964 Xcol[row] = tmpval * m.data (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1965 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1966 else \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1967 Xcol[row] += tmpval * m.data (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1968 } \ |
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 for (octave_idx_type k = 0; k < nr; k++) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1971 if (w[k] == i + 1) \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1972 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1973 retval.xdata (ii) = Xcol[k]; \ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1974 retval.xridx (ii++) = k; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1975 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1976 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1977 else \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1978 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1979 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
|
1980 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1981 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
|
1982 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
|
1983 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
|
1984 k < m.cidx (col+1); k++) \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1985 { \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1986 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1987 octave_idx_type row = m.ridx (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1988 if (w[row] < i + 1) \ |
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 w[row] = i + 1; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1991 retval.xridx (ii++) = row;\ |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1992 Xcol[row] = tmpval * m.data (k); \ |
10312
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 else \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1995 Xcol[row] += tmpval * m.data (k); \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1996 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
1997 } \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
1998 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
|
1999 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
|
2000 retval.xdata (k) = Xcol[retval.xridx (k)]; \ |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2001 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2002 } \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2003 retval.maybe_compress (true);\ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2004 return retval; \ |
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
2005 } \ |
5164 | 2006 } |
2007 | |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
2008 #define SPARSE_FULL_MUL(RET_TYPE, EL_TYPE, ZERO) \ |
5429 | 2009 octave_idx_type nr = m.rows (); \ |
2010 octave_idx_type nc = m.cols (); \ | |
2011 \ | |
2012 octave_idx_type a_nr = a.rows (); \ | |
2013 octave_idx_type a_nc = a.cols (); \ | |
2014 \ | |
6221 | 2015 if (nr == 1 && nc == 1) \ |
2016 { \ | |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2017 RET_TYPE retval = m.elem (0,0) * a; \ |
6221 | 2018 return retval; \ |
2019 } \ | |
2020 else if (nc != a_nr) \ | |
5429 | 2021 { \ |
2022 gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ | |
2023 return RET_TYPE (); \ | |
2024 } \ | |
2025 else \ | |
2026 { \ | |
5681 | 2027 RET_TYPE retval (nr, a_nc, ZERO); \ |
5429 | 2028 \ |
2029 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
|
2030 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2031 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
|
2032 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
2033 octave_quit (); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2034 \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2035 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
|
2036 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
|
2037 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
|
2038 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2039 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2040 return retval; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2041 } |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2042 |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
2043 #define SPARSE_FULL_TRANS_MUL(RET_TYPE, EL_TYPE, ZERO, CONJ_OP) \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2044 octave_idx_type nr = m.rows (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2045 octave_idx_type nc = m.cols (); \ |
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 octave_idx_type a_nr = a.rows (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2048 octave_idx_type a_nc = a.cols (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2049 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2050 if (nr == 1 && nc == 1) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2051 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2052 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
|
2053 return retval; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2054 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2055 else if (nr != a_nr) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2056 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2057 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
|
2058 return RET_TYPE (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2059 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2060 else \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2061 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2062 RET_TYPE retval (nc, a_nc); \ |
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 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
|
2065 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2066 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
|
2067 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
2068 octave_quit (); \ |
7802
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 EL_TYPE acc = ZERO; \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2071 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
|
2072 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
|
2073 retval.xelem (j,i) = acc; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2074 } \ |
5429 | 2075 } \ |
2076 return retval; \ | |
2077 } | |
2078 | |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
2079 #define FULL_SPARSE_MUL(RET_TYPE, EL_TYPE, ZERO) \ |
5429 | 2080 octave_idx_type nr = m.rows (); \ |
2081 octave_idx_type nc = m.cols (); \ | |
2082 \ | |
2083 octave_idx_type a_nr = a.rows (); \ | |
2084 octave_idx_type a_nc = a.cols (); \ | |
2085 \ | |
6221 | 2086 if (a_nr == 1 && a_nc == 1) \ |
2087 { \ | |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2088 RET_TYPE retval = m * a.elem (0,0); \ |
6221 | 2089 return retval; \ |
2090 } \ | |
2091 else if (nc != a_nr) \ | |
5429 | 2092 { \ |
2093 gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ | |
2094 return RET_TYPE (); \ | |
2095 } \ | |
2096 else \ | |
2097 { \ | |
5681 | 2098 RET_TYPE retval (nr, a_nc, ZERO); \ |
5429 | 2099 \ |
2100 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
|
2101 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
2102 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2103 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
|
2104 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2105 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
|
2106 EL_TYPE tmpval = a.data (j); \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2107 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2108 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
|
2109 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
|
2110 } \ |
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 return retval; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2113 } |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2114 |
18833
6113e0c6920b
maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents:
17822
diff
changeset
|
2115 #define FULL_SPARSE_MUL_TRANS(RET_TYPE, EL_TYPE, ZERO, CONJ_OP) \ |
7802
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2116 octave_idx_type nr = m.rows (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2117 octave_idx_type nc = m.cols (); \ |
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 octave_idx_type a_nr = a.rows (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2120 octave_idx_type a_nc = a.cols (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2121 \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2122 if (a_nr == 1 && a_nc == 1) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2123 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2124 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
|
2125 return retval; \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2126 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2127 else if (nc != a_nc) \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2128 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2129 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
|
2130 return RET_TYPE (); \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2131 } \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2132 else \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2133 { \ |
1a446f28ce68
implement optimized sparse-dense transposed multiplication
Jaroslav Hajek <highegg@gmail.com>
parents:
7350
diff
changeset
|
2134 RET_TYPE retval (nr, a_nr, ZERO); \ |
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 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
|
2137 { \ |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9578
diff
changeset
|
2138 octave_quit (); \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2139 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
|
2140 { \ |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14846
diff
changeset
|
2141 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
|
2142 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
|
2143 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
|
2144 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
|
2145 } \ |
5429 | 2146 } \ |
2147 return retval; \ | |
2148 } | |
2149 | |
5164 | 2150 #endif |