annotate liboctave/Sparse-op-defs.h @ 7334:274d9642ac10 release-3-0-0

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