annotate src/DLD-FUNCTIONS/spfind.cc @ 7017:a1dbe9d80eee

[project @ 2007-10-12 21:27:11 by jwe]
author jwe
date Fri, 12 Oct 2007 21:27:37 +0000
parents 93c65f2a5668
children
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
7017
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
3 Copyright (C) 2006, 2007 David Bateman
6011
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
4
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6013
diff changeset
5 This file is part of Octave.
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6013
diff changeset
6
6011
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
7 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
8 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: 6013
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6013
diff changeset
10 option) any later version.
6011
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
11
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
12 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
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
14 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
15 for more details.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
16
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
17 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: 6013
diff changeset
18 along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6013
diff changeset
19 <http://www.gnu.org/licenses/>.
6011
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
23 #ifdef HAVE_CONFIG_H
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
24 #include <config.h>
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
25 #endif
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
26
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
27 #include <cstdlib>
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
28 #include <string>
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
29
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
30 #include "variables.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
31 #include "utils.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
32 #include "pager.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
33 #include "defun-dld.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
34 #include "gripes.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
35 #include "quit.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
36
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
37 #include "ov-re-sparse.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
38 #include "ov-cx-sparse.h"
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
39
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
40 template <typename T, typename M>
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
41 octave_value_list
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
42 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
43 octave_idx_type n_to_find, int direction)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
44 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
45 octave_value_list retval ((nargout == 0 ? 1 : nargout), Matrix ());
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
48 octave_idx_type nc = v.cols();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
49 octave_idx_type nr = v.rows();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
50 octave_idx_type nz = v.nnz();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
51
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
52 // Search in the default range.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
53 octave_idx_type start_nc = -1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
54 octave_idx_type end_nc = -1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
55 octave_idx_type count;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
56
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
57 // Search for the range to search
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
58 if (n_to_find < 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
59 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
60 start_nc = 0;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
61 end_nc = nc;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
62 n_to_find = nz;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
63 count = nz;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
64 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
65 else if (direction > 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
66 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
67 for (octave_idx_type j = 0; j < nc; j++)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
68 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
69 OCTAVE_QUIT;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
70 if (v.cidx(j) == 0 && v.cidx(j+1) != 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
71 start_nc = j;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
72 if (v.cidx(j+1) >= n_to_find)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
73 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
74 end_nc = j + 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
75 break;
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 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
79 else
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
80 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
81 for (octave_idx_type j = nc; j > 0; j--)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
82 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
83 OCTAVE_QUIT;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
84 if (v.cidx(j) == nz && v.cidx(j-1) != nz)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
85 end_nc = j;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
86 if (nz - v.cidx(j-1) >= n_to_find)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
87 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
88 start_nc = j - 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
89 break;
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
94 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
95 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
96
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
97 // 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
98 // 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
99 // case...
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
100
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
101 octave_idx_type result_nr = count;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
102 octave_idx_type result_nc = 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
103
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
104 bool scalar_arg = false;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
105
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
106 if (v.rows () == 1)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
107 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
108 result_nr = 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
109 result_nc = count;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
110
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
111 scalar_arg = (v.columns () == 1);
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
114 Matrix idx (result_nr, result_nc);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
115
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
116 Matrix i_idx (result_nr, result_nc);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
117 Matrix j_idx (result_nr, result_nc);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
118
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
119 val = M(result_nr, result_nc);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
120
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
121 if (count > 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
122 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
123 // Search for elements to return. Only search the region where
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
124 // 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
125 // to find.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
126 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
127 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
128 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
129 OCTAVE_QUIT;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
130 if (direction < 0 && i < nz - count)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
131 continue;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
132 i_idx (cx) = static_cast<double> (v.ridx(i) + 1);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
133 j_idx (cx) = static_cast<double> (j + 1);
6013
13c4326d3501 [project @ 2006-09-29 20:50:34 by jwe]
jwe
parents: 6011
diff changeset
134 idx (cx) = j * nr + v.ridx(i) + 1;
6011
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
135 val (cx) = v.data(i);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
136 cx++;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
137 if (cx == count)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
138 break;
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 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
141 else if (scalar_arg)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
142 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
143 idx.resize (0, 0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
144
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
145 i_idx.resize (0, 0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
146 j_idx.resize (0, 0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
147
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
148 val.resize (0, 0);
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
151 switch (nargout)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
152 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
153 case 0:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
154 case 1:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
155 retval(0) = idx;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
156 break;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
157
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
158 case 5:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
159 retval(4) = nc;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
160 // Fall through
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
161
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
162 case 4:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
163 retval(3) = nr;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
164 // Fall through
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
165
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
166 case 3:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
167 retval(2) = val;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
168 // Fall through!
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
169
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
170 case 2:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
171 retval(1) = j_idx;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
172 retval(0) = i_idx;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
173 break;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
174
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
175 default:
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
176 panic_impossible ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
177 break;
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
180 return retval;
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
183 template octave_value_list sparse_find_non_zero_elem_idx
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
184 (const SparseMatrix&, Matrix&, int, octave_idx_type, int);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
185
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
186 template octave_value_list sparse_find_non_zero_elem_idx
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
187 (const SparseComplexMatrix&, ComplexMatrix&, int, octave_idx_type, int);
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
190 // PKG_ADD: dispatch ("find", "spfind", "sparse matrix");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
191 // PKG_ADD: dispatch ("find", "spfind", "sparse complex matrix");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
192 // PKG_ADD: dispatch ("find", "spfind", "sparse bool matrix");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
193 DEFUN_DLD (spfind, args, nargout,
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
194 "-*- texinfo -*-\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
195 @deftypefn {Loadable Function} {} spfind (@var{x})\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
196 @deftypefnx {Loadable Function} {} spfind (@var{x}, @var{n})\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
197 @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
198 @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
199 \n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
200 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
201 for details of its use.\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
202 \n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
203 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
204 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
205 create the original matrix. For example,\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
206 \n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
207 @example\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
208 @group\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
209 sz = size(a);\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
210 [i, j, v] = spfind (a);\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
211 b = sparse(i, j, v, sz(1), sz(2));\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
212 @end group\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
213 @end example\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
214 @seealso{sparse}\n\
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
215 @end deftypefn")
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
216 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
217 octave_value_list retval;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
218 int nargin = args.length ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
219
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
220 if (nargin > 3 || nargin < 1)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
221 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
222 print_usage ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
223 return retval;
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
226 // Setup the default options.
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
227 octave_idx_type n_to_find = -1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
228 if (nargin > 1)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
229 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
230 n_to_find = args(1).int_value ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
231 if (error_state)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
232 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
233 error ("find: expecting second argument to be an integer");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
234 return retval;
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
238 // Direction to do the searching (1 == forward, -1 == reverse).
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
239 int direction = 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
240 if (nargin > 2)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
241 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
242 direction = 0;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
243
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
244 std::string s_arg = args(2).string_value ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
245
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
246 if (! error_state)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
247 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
248 if (s_arg == "first")
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
249 direction = 1;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
250 else if (s_arg == "last")
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
251 direction = -1;
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
254 if (direction == 0)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
255 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
256 error ("find: expecting third argument to be \"first\" or \"last\"");
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
257 return retval;
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
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
261 octave_value arg = args(0);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
262
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
263 if (arg.is_real_type ())
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
264 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
265 SparseMatrix v = arg.sparse_matrix_value ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
266 Matrix val;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
267
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
268 if (! error_state)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
269 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
270 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
271 else if (arg.is_complex_type ())
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
272 {
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
273 SparseComplexMatrix v = arg.sparse_complex_matrix_value ();
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
274 ComplexMatrix val;
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
275
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
276 if (! error_state)
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
277 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
278 }
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
279 else
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
280 gripe_wrong_type_arg ("spfind", arg);
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
281
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
282 return retval;
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 /*
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
286 ;;; Local Variables: ***
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
287 ;;; mode: C++ ***
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
288 ;;; End: ***
d3112590883f [project @ 2006-09-29 18:20:08 by jwe]
jwe
parents:
diff changeset
289 */