annotate src/DLD-FUNCTIONS/spfind.cc @ 6013:13c4326d3501

[project @ 2006-09-29 20:50:34 by jwe]
author jwe
date Fri, 29 Sep 2006 20:50:35 +0000
parents d3112590883f
children 93c65f2a5668
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6011
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
1 /*
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
2
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
3 Copyright (C) 2006 David Bateman
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
4
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
5 Octave is free software; you can redistribute it and/or modify it
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
6 under the terms of the GNU General Public License as published by the
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
7 Free Software Foundation; either version 2, or (at your option) any
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
8 later version.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
9
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
10 Octave is distributed in the hope that it will be useful, but WITHOUT
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
13 for more details.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
14
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
16 along with this program; see the file COPYING. If not, write to the
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
18 Boston, MA 02110-1301, USA.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
19
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
20 */
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
21
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
22 #ifdef HAVE_CONFIG_H
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
23 #include <config.h>
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
24 #endif
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
25
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
26 #include <cstdlib>
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
27 #include <string>
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
28
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
29 #include "variables.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
30 #include "utils.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
31 #include "pager.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
32 #include "defun-dld.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
33 #include "gripes.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
34 #include "quit.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
35
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
36 #include "ov-re-sparse.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
37 #include "ov-cx-sparse.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
38
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
39 template <typename T, typename M>
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
40 octave_value_list
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
41 sparse_find_non_zero_elem_idx (const T& v, M& val, int nargout,
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
42 octave_idx_type n_to_find, int direction)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
43 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
44 octave_value_list retval ((nargout == 0 ? 1 : nargout), Matrix ());
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
45
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
46
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
47 octave_idx_type nc = v.cols();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
48 octave_idx_type nr = v.rows();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
49 octave_idx_type nz = v.nnz();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
50
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
51 // Search in the default range.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
52 octave_idx_type start_nc = -1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
53 octave_idx_type end_nc = -1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
54 octave_idx_type count;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
55
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
56 // Search for the range to search
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
57 if (n_to_find < 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
58 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
59 start_nc = 0;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
60 end_nc = nc;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
61 n_to_find = nz;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
62 count = nz;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
63 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
64 else if (direction > 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
65 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
66 for (octave_idx_type j = 0; j < nc; j++)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
67 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
68 OCTAVE_QUIT;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
69 if (v.cidx(j) == 0 && v.cidx(j+1) != 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
70 start_nc = j;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
71 if (v.cidx(j+1) >= n_to_find)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
72 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
73 end_nc = j + 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
74 break;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
75 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
76 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
77 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
78 else
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
79 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
80 for (octave_idx_type j = nc; j > 0; j--)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
81 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
82 OCTAVE_QUIT;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
83 if (v.cidx(j) == nz && v.cidx(j-1) != nz)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
84 end_nc = j;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
85 if (nz - v.cidx(j-1) >= n_to_find)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
86 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
87 start_nc = j - 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
88 break;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
89 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
90 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
91 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
92
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
93 count = (n_to_find > v.cidx(end_nc) - v.cidx(start_nc) ?
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
94 v.cidx(end_nc) - v.cidx(start_nc) : n_to_find);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
95
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
96 // If the original argument was a row vector, force a row vector of
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
97 // the overall indices to be returned. But see below for scalar
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
98 // case...
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
99
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
100 octave_idx_type result_nr = count;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
101 octave_idx_type result_nc = 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
102
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
103 bool scalar_arg = false;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
104
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
105 if (v.rows () == 1)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
106 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
107 result_nr = 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
108 result_nc = count;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
109
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
110 scalar_arg = (v.columns () == 1);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
111 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
112
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
113 Matrix idx (result_nr, result_nc);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
114
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
115 Matrix i_idx (result_nr, result_nc);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
116 Matrix j_idx (result_nr, result_nc);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
117
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
118 val = M(result_nr, result_nc);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
119
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
120 if (count > 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
121 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
122 // Search for elements to return. Only search the region where
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
123 // there are elements to be found using the count that we want
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
124 // to find.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
125 for (octave_idx_type j = start_nc, cx = 0; j < end_nc; j++)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
126 for (octave_idx_type i = v.cidx(j); i < v.cidx(j+1); i++ )
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
127 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
128 OCTAVE_QUIT;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
129 if (direction < 0 && i < nz - count)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
130 continue;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
131 i_idx (cx) = static_cast<double> (v.ridx(i) + 1);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
132 j_idx (cx) = static_cast<double> (j + 1);
6013
13c4326d3501 [project @ 2006-09-29 20:50:34 by jwe]
jwe
parents: 6011
diff changeset
133 idx (cx) = j * nr + v.ridx(i) + 1;
6011
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
134 val (cx) = v.data(i);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
135 cx++;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
136 if (cx == count)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
137 break;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
138 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
139 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
140 else if (scalar_arg)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
141 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
142 idx.resize (0, 0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
143
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
144 i_idx.resize (0, 0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
145 j_idx.resize (0, 0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
146
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
147 val.resize (0, 0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
148 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
149
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
150 switch (nargout)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
151 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
152 case 0:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
153 case 1:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
154 retval(0) = idx;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
155 break;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
156
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
157 case 5:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
158 retval(4) = nc;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
159 // Fall through
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
160
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
161 case 4:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
162 retval(3) = nr;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
163 // Fall through
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
164
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
165 case 3:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
166 retval(2) = val;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
167 // Fall through!
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
168
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
169 case 2:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
170 retval(1) = j_idx;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
171 retval(0) = i_idx;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
172 break;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
173
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
174 default:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
175 panic_impossible ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
176 break;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
177 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
178
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
179 return retval;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
180 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
181
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
182 template octave_value_list sparse_find_non_zero_elem_idx
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
183 (const SparseMatrix&, Matrix&, int, octave_idx_type, int);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
184
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
185 template octave_value_list sparse_find_non_zero_elem_idx
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
186 (const SparseComplexMatrix&, ComplexMatrix&, int, octave_idx_type, int);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
187
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
188
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
189 // PKG_ADD: dispatch ("find", "spfind", "sparse matrix");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
190 // PKG_ADD: dispatch ("find", "spfind", "sparse complex matrix");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
191 // PKG_ADD: dispatch ("find", "spfind", "sparse bool matrix");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
192 DEFUN_DLD (spfind, args, nargout,
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
193 "-*- texinfo -*-\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
194 @deftypefn {Loadable Function} {} spfind (@var{x})\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
195 @deftypefnx {Loadable Function} {} spfind (@var{x}, @var{n})\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
196 @deftypefnx {Loadable Function} {} spfind (@var{x}, @var{n}, @var{direction})\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
197 @deftypefnx {Loadable Function} {[@var{i}, @var{j}, @var{v}} spfind (@dots{})\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
198 \n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
199 A sparse version of the @code{find} function. Please see the @code{find}\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
200 for details of its use.\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
201 \n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
202 Note that this function is particularly useful for sparse matrices, as\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
203 it extracts the non-zero elements as vectors, which can then be used to\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
204 create the original matrix. For example,\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
205 \n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
206 @example\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
207 @group\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
208 sz = size(a);\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
209 [i, j, v] = spfind (a);\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
210 b = sparse(i, j, v, sz(1), sz(2));\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
211 @end group\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
212 @end example\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
213 @seealso{sparse}\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
214 @end deftypefn")
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
215 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
216 octave_value_list retval;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
217 int nargin = args.length ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
218
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
219 if (nargin > 3 || nargin < 1)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
220 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
221 print_usage ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
222 return retval;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
223 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
224
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
225 // Setup the default options.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
226 octave_idx_type n_to_find = -1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
227 if (nargin > 1)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
228 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
229 n_to_find = args(1).int_value ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
230 if (error_state)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
231 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
232 error ("find: expecting second argument to be an integer");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
233 return retval;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
234 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
235 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
236
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
237 // Direction to do the searching (1 == forward, -1 == reverse).
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
238 int direction = 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
239 if (nargin > 2)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
240 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
241 direction = 0;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
242
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
243 std::string s_arg = args(2).string_value ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
244
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
245 if (! error_state)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
246 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
247 if (s_arg == "first")
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
248 direction = 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
249 else if (s_arg == "last")
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
250 direction = -1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
251 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
252
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
253 if (direction == 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
254 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
255 error ("find: expecting third argument to be \"first\" or \"last\"");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
256 return retval;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
257 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
258 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
259
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
260 octave_value arg = args(0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
261
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
262 if (arg.is_real_type ())
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
263 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
264 SparseMatrix v = arg.sparse_matrix_value ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
265 Matrix val;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
266
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
267 if (! error_state)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
268 retval = sparse_find_non_zero_elem_idx (v, val, nargout, n_to_find, direction);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
269 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
270 else if (arg.is_complex_type ())
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
271 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
272 SparseComplexMatrix v = arg.sparse_complex_matrix_value ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
273 ComplexMatrix val;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
274
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
275 if (! error_state)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
276 retval = sparse_find_non_zero_elem_idx (v, val, nargout, n_to_find, direction);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
277 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
278 else
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
279 gripe_wrong_type_arg ("spfind", arg);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
280
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
281 return retval;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
282 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
283
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
284 /*
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
285 ;;; Local Variables: ***
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
286 ;;; mode: C++ ***
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
287 ;;; End: ***
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
288 */