annotate src/DLD-FUNCTIONS/find.cc @ 9019:12ca81f1fa99

compatibility fix for find called for empty arguments
author John W. Eaton <jwe@octave.org>
date Wed, 25 Mar 2009 19:02:15 -0400
parents 6d3fcbf89267
children e67dc11ed6e8 97aa01a85ea4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
1 /*
295f037b4b3e [project @ 1997-05-05 05:32:33 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) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
8920
eb63fbe60fab update copyright notices
John W. Eaton <jwe@octave.org>
parents: 8810
diff changeset
4 2007, 2008, 2009 John W. Eaton
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
5
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
7
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
295f037b4b3e [project @ 1997-05-05 05:32:33 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: 6524
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: 6524
diff changeset
11 option) any later version.
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
12
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
16 for more details.
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
17
295f037b4b3e [project @ 1997-05-05 05:32:33 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: 6524
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: 6524
diff changeset
20 <http://www.gnu.org/licenses/>.
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
21
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
22 */
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
23
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
25 #include <config.h>
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
26 #endif
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
27
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 3418
diff changeset
28 #include "quit.h"
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 3418
diff changeset
29
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
30 #include "defun-dld.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
31 #include "error.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
32 #include "gripes.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
33 #include "oct-obj.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
34
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
35 // Find at most N_TO_FIND nonzero elements in NDA. Search forward if
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
36 // DIRECTION is 1, backward if it is -1. NARGOUT is the number of
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
37 // output arguments. If N_TO_FIND is -1, find all nonzero elements.
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
38
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
39 template <typename T>
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
40 octave_value_list
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
41 find_nonzero_elem_idx (const Array<T>& nda, int nargout,
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
42 octave_idx_type n_to_find, int direction)
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
43 {
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
44 octave_value_list retval ((nargout == 0 ? 1 : nargout), Matrix ());
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
45
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5131
diff changeset
46 octave_idx_type count = 0;
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
47
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5131
diff changeset
48 octave_idx_type nel = nda.nelem ();
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
49
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
50 // Set the starting element to the correct value based on the
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
51 // direction to search.
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
52 octave_idx_type k = 0;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
53 if (direction == -1)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
54 k = nel - 1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
55
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
56 // Search in the default range.
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
57 octave_idx_type start_el = -1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
58 octave_idx_type end_el = -1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
59
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
60 // Search for the number of elements to return.
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
61 while (k < nel && k > -1 && n_to_find != count)
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
62 {
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
63 OCTAVE_QUIT;
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
64
8810
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
65 if (nda(k) != T ())
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
66 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
67 end_el = k;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
68 if (start_el == -1)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
69 start_el = k;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
70 count++;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
71 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
72 k = k + direction;
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
73 }
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
74
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
75 // Reverse the range if we're looking backward.
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
76 if (direction == -1)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
77 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
78 octave_idx_type tmp_el = start_el;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
79 start_el = end_el;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
80 end_el = tmp_el;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
81 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
82 // Fix an off by one error.
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
83 end_el++;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
84
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
85 // If the original argument was a row vector, force a row vector of
5130
3bf4c0cd775d [project @ 2005-02-08 03:01:13 by jwe]
jwe
parents: 5107
diff changeset
86 // the overall indices to be returned. But see below for scalar
3bf4c0cd775d [project @ 2005-02-08 03:01:13 by jwe]
jwe
parents: 5107
diff changeset
87 // case...
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
88
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5131
diff changeset
89 octave_idx_type result_nr = count;
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5131
diff changeset
90 octave_idx_type result_nc = 1;
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
91
9019
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
92 bool column_vector_arg = false;
5130
3bf4c0cd775d [project @ 2005-02-08 03:01:13 by jwe]
jwe
parents: 5107
diff changeset
93 bool scalar_arg = false;
3bf4c0cd775d [project @ 2005-02-08 03:01:13 by jwe]
jwe
parents: 5107
diff changeset
94
9019
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
95 if (nda.ndims () == 2)
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
96 {
9019
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
97 octave_idx_type nr = nda.rows ();
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
98 octave_idx_type nc = nda.columns ();
5130
3bf4c0cd775d [project @ 2005-02-08 03:01:13 by jwe]
jwe
parents: 5107
diff changeset
99
9019
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
100 if (nr == 1)
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
101 {
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
102 result_nr = 1;
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
103 result_nc = count;
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
104
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
105 scalar_arg = (nc == 1);
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
106 }
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
107 else if (nc == 1)
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
108 column_vector_arg = true;
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
109 }
3418
ca92c9d3f882 [project @ 2000-01-12 03:07:47 by jwe]
jwe
parents: 3369
diff changeset
110
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
111 Matrix idx (result_nr, result_nc);
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
112
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
113 Matrix i_idx (result_nr, result_nc);
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
114 Matrix j_idx (result_nr, result_nc);
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
115
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
116 ArrayN<T> val (dim_vector (result_nr, result_nc));
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
117
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
118 if (count > 0)
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
119 {
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
120 count = 0;
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
121
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5131
diff changeset
122 octave_idx_type nr = nda.rows ();
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
123
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5131
diff changeset
124 octave_idx_type i = 0;
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
125
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
126 // Search for elements to return. Only search the region where
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
127 // there are elements to be found using the count that we want
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
128 // to find.
6005
b4351cfb5659 [project @ 2006-09-26 21:38:16 by jwe]
jwe
parents: 6002
diff changeset
129
b4351cfb5659 [project @ 2006-09-26 21:38:16 by jwe]
jwe
parents: 6002
diff changeset
130 // For compatibility, all N-d arrays are handled as if they are
b4351cfb5659 [project @ 2006-09-26 21:38:16 by jwe]
jwe
parents: 6002
diff changeset
131 // 2-d, with the number of columns equal to "prod (dims (2:end))".
b4351cfb5659 [project @ 2006-09-26 21:38:16 by jwe]
jwe
parents: 6002
diff changeset
132
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
133 for (k = start_el; k < end_el; k++)
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
134 {
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
135 OCTAVE_QUIT;
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
136
8810
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
137 if (nda(k) != T ())
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
138 {
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
139 idx(count) = k + 1;
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
140
6005
b4351cfb5659 [project @ 2006-09-26 21:38:16 by jwe]
jwe
parents: 6002
diff changeset
141 octave_idx_type xr = k % nr;
b4351cfb5659 [project @ 2006-09-26 21:38:16 by jwe]
jwe
parents: 6002
diff changeset
142 i_idx(count) = xr + 1;
b4351cfb5659 [project @ 2006-09-26 21:38:16 by jwe]
jwe
parents: 6002
diff changeset
143 j_idx(count) = (k - xr) / nr + 1;
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
144
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
145 val(count) = nda(k);
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
146
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
147 count++;
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
148 }
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
149
4826
a7b1e6122d0c [project @ 2004-03-09 19:57:29 by jwe]
jwe
parents: 4678
diff changeset
150 i++;
4678
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
151 }
e1c2d8ca8bc0 [project @ 2003-12-17 00:36:36 by jwe]
jwe
parents: 4628
diff changeset
152 }
9019
12ca81f1fa99 compatibility fix for find called for empty arguments
John W. Eaton <jwe@octave.org>
parents: 8955
diff changeset
153 else if (scalar_arg || (nda.rows () == 0 && ! column_vector_arg))
5131
89cddd966068 [project @ 2005-02-08 03:32:25 by jwe]
jwe
parents: 5130
diff changeset
154 {
89cddd966068 [project @ 2005-02-08 03:32:25 by jwe]
jwe
parents: 5130
diff changeset
155 idx.resize (0, 0);
89cddd966068 [project @ 2005-02-08 03:32:25 by jwe]
jwe
parents: 5130
diff changeset
156
89cddd966068 [project @ 2005-02-08 03:32:25 by jwe]
jwe
parents: 5130
diff changeset
157 i_idx.resize (0, 0);
89cddd966068 [project @ 2005-02-08 03:32:25 by jwe]
jwe
parents: 5130
diff changeset
158 j_idx.resize (0, 0);
89cddd966068 [project @ 2005-02-08 03:32:25 by jwe]
jwe
parents: 5130
diff changeset
159
89cddd966068 [project @ 2005-02-08 03:32:25 by jwe]
jwe
parents: 5130
diff changeset
160 val.resize (dim_vector (0, 0));
89cddd966068 [project @ 2005-02-08 03:32:25 by jwe]
jwe
parents: 5130
diff changeset
161 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
162
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
163 switch (nargout)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
164 {
6254
5b43c2332b69 [project @ 2007-01-29 17:35:15 by jwe]
jwe
parents: 6026
diff changeset
165 default:
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
166 case 3:
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
167 retval(2) = val;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
168 // Fall through!
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
169
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
170 case 2:
3418
ca92c9d3f882 [project @ 2000-01-12 03:07:47 by jwe]
jwe
parents: 3369
diff changeset
171 retval(1) = j_idx;
ca92c9d3f882 [project @ 2000-01-12 03:07:47 by jwe]
jwe
parents: 3369
diff changeset
172 retval(0) = i_idx;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
173 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
174
6254
5b43c2332b69 [project @ 2007-01-29 17:35:15 by jwe]
jwe
parents: 6026
diff changeset
175 case 1:
5b43c2332b69 [project @ 2007-01-29 17:35:15 by jwe]
jwe
parents: 6026
diff changeset
176 case 0:
5b43c2332b69 [project @ 2007-01-29 17:35:15 by jwe]
jwe
parents: 6026
diff changeset
177 retval(0) = idx;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
178 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
179 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
180
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
181 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
182 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
183
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
184 template octave_value_list find_nonzero_elem_idx (const Array<double>&, int,
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
185 octave_idx_type, int);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
186
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
187 template octave_value_list find_nonzero_elem_idx (const Array<Complex>&, int,
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
188 octave_idx_type, int);
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
189
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
190 template octave_value_list find_nonzero_elem_idx (const Array<float>&, int,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
191 octave_idx_type, int);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
192
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
193 template octave_value_list find_nonzero_elem_idx (const Array<FloatComplex>&,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
194 int, octave_idx_type, int);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
195
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
196 template <typename T>
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
197 octave_value_list
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
198 find_nonzero_elem_idx (const Sparse<T>& v, int nargout,
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
199 octave_idx_type n_to_find, int direction)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
200 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
201 octave_value_list retval ((nargout == 0 ? 1 : nargout), Matrix ());
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
202
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
203
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
204 octave_idx_type nc = v.cols();
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
205 octave_idx_type nr = v.rows();
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
206 octave_idx_type nz = v.nnz();
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
207
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
208 // Search in the default range.
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
209 octave_idx_type start_nc = -1;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
210 octave_idx_type end_nc = -1;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
211 octave_idx_type count;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
212
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
213 // Search for the range to search
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
214 if (n_to_find < 0)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
215 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
216 start_nc = 0;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
217 end_nc = nc;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
218 n_to_find = nz;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
219 count = nz;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
220 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
221 else if (direction > 0)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
222 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
223 for (octave_idx_type j = 0; j < nc; j++)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
224 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
225 OCTAVE_QUIT;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
226 if (v.cidx(j) == 0 && v.cidx(j+1) != 0)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
227 start_nc = j;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
228 if (v.cidx(j+1) >= n_to_find)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
229 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
230 end_nc = j + 1;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
231 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
232 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
233 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
234 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
235 else
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
236 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
237 for (octave_idx_type j = nc; j > 0; j--)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
238 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
239 OCTAVE_QUIT;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
240 if (v.cidx(j) == nz && v.cidx(j-1) != nz)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
241 end_nc = j;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
242 if (nz - v.cidx(j-1) >= n_to_find)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
243 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
244 start_nc = j - 1;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
245 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
246 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
247 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
248 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
249
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
250 count = (n_to_find > v.cidx(end_nc) - v.cidx(start_nc) ?
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
251 v.cidx(end_nc) - v.cidx(start_nc) : n_to_find);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
252
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
253 // If the original argument was a row vector, force a row vector of
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
254 // the overall indices to be returned. But see below for scalar
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
255 // case...
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
256
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
257 octave_idx_type result_nr = count;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
258 octave_idx_type result_nc = 1;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
259
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
260 bool scalar_arg = false;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
261
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
262 if (v.rows () == 1)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
263 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
264 result_nr = 1;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
265 result_nc = count;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
266
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
267 scalar_arg = (v.columns () == 1);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
268 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
269
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
270 Matrix idx (result_nr, result_nc);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
271
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
272 Matrix i_idx (result_nr, result_nc);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
273 Matrix j_idx (result_nr, result_nc);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
274
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
275 ArrayN<T> val (dim_vector (result_nr, result_nc));
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
276
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
277 if (count > 0)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
278 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
279 // Search for elements to return. Only search the region where
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
280 // there are elements to be found using the count that we want
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
281 // to find.
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
282 for (octave_idx_type j = start_nc, cx = 0; j < end_nc; j++)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
283 for (octave_idx_type i = v.cidx(j); i < v.cidx(j+1); i++ )
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
284 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
285 OCTAVE_QUIT;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
286 if (direction < 0 && i < nz - count)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
287 continue;
8810
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
288 i_idx(cx) = static_cast<double> (v.ridx(i) + 1);
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
289 j_idx(cx) = static_cast<double> (j + 1);
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
290 idx(cx) = j * nr + v.ridx(i) + 1;
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
291 val(cx) = v.data(i);
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
292 cx++;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
293 if (cx == count)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
294 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
295 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
296 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
297 else if (scalar_arg)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
298 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
299 idx.resize (0, 0);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
300
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
301 i_idx.resize (0, 0);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
302 j_idx.resize (0, 0);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
303
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
304 val.resize (dim_vector (0, 0));
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
305 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
306
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
307 switch (nargout)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
308 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
309 case 0:
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
310 case 1:
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
311 retval(0) = idx;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
312 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
313
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
314 case 5:
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
315 retval(4) = nc;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
316 // Fall through
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
317
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
318 case 4:
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
319 retval(3) = nr;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
320 // Fall through
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
321
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
322 case 3:
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
323 retval(2) = val;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
324 // Fall through!
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
325
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
326 case 2:
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
327 retval(1) = j_idx;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
328 retval(0) = i_idx;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
329 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
330
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
331 default:
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
332 panic_impossible ();
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
333 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
334 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
335
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
336 return retval;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
337 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
338
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
339 template octave_value_list find_nonzero_elem_idx (const Sparse<double>&, int,
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
340 octave_idx_type, int);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
341
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
342 template octave_value_list find_nonzero_elem_idx (const Sparse<Complex>&, int,
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
343 octave_idx_type, int);
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
344
8955
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
345 octave_value_list
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
346 find_nonzero_elem_idx (const PermMatrix& v, int nargout,
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
347 octave_idx_type n_to_find, int direction)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
348 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
349 // There are far fewer special cases to handle for a PermMatrix.
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
350 octave_value_list retval ((nargout == 0 ? 1 : nargout), Matrix ());
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
351
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
352 octave_idx_type nc = v.cols();
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
353 octave_idx_type start_nc, end_nc, count;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
354
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
355 // Determine the range to search.
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
356 if (n_to_find < 0 || n_to_find >= nc)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
357 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
358 start_nc = 0;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
359 end_nc = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
360 n_to_find = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
361 count = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
362 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
363 else if (direction > 0)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
364 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
365 start_nc = 0;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
366 end_nc = n_to_find;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
367 count = n_to_find;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
368 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
369 else
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
370 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
371 start_nc = nc - n_to_find;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
372 end_nc = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
373 count = n_to_find;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
374 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
375
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
376 bool scalar_arg = (v.rows () == 1 && v.cols () == 1);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
377
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
378 Matrix idx (count, 1);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
379 Matrix i_idx (count, 1);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
380 Matrix j_idx (count, 1);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
381 // Every value is 1.
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
382 ArrayN<double> val (dim_vector (count, 1), 1.0);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
383
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
384 if (count > 0)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
385 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
386 const octave_idx_type* p = v.data ();
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
387 if (v.is_col_perm ())
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
388 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
389 for (octave_idx_type k = 0; k < count; k++)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
390 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
391 OCTAVE_QUIT;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
392 const octave_idx_type j = start_nc + k;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
393 const octave_idx_type i = p[j];
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
394 i_idx(k) = static_cast<double> (1+i);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
395 j_idx(k) = static_cast<double> (1+j);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
396 idx(k) = j * nc + i + 1;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
397 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
398 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
399 else
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
400 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
401 for (octave_idx_type k = 0; k < count; k++)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
402 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
403 OCTAVE_QUIT;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
404 const octave_idx_type i = start_nc + k;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
405 const octave_idx_type j = p[i];
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
406 // Scatter into the index arrays according to
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
407 // j adjusted by the start point.
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
408 const octave_idx_type koff = j - start_nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
409 i_idx(koff) = static_cast<double> (1+i);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
410 j_idx(koff) = static_cast<double> (1+j);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
411 idx(koff) = j * nc + i + 1;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
412 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
413 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
414 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
415 else if (scalar_arg)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
416 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
417 // Same odd compatibility case as the other overrides.
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
418 idx.resize (0, 0);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
419 i_idx.resize (0, 0);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
420 j_idx.resize (0, 0);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
421 val.resize (dim_vector (0, 0));
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
422 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
423
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
424 switch (nargout)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
425 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
426 case 0:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
427 case 1:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
428 retval(0) = idx;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
429 break;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
430
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
431 case 5:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
432 retval(4) = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
433 // Fall through
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
434
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
435 case 4:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
436 retval(3) = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
437 // Fall through
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
438
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
439 case 3:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
440 retval(2) = val;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
441 // Fall through!
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
442
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
443 case 2:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
444 retval(1) = j_idx;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
445 retval(0) = i_idx;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
446 break;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
447
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
448 default:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
449 panic_impossible ();
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
450 break;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
451 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
452
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
453 return retval;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
454 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
455
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
456 DEFUN_DLD (find, args, nargout,
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
457 "-*- texinfo -*-\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
458 @deftypefn {Loadable Function} {} find (@var{x})\n\
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
459 @deftypefnx {Loadable Function} {} find (@var{x}, @var{n})\n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
460 @deftypefnx {Loadable Function} {} find (@var{x}, @var{n}, @var{direction})\n\
6524
03c89ade4070 [project @ 2007-04-13 12:19:30 by jwe]
jwe
parents: 6254
diff changeset
461 Return a vector of indices of nonzero elements of a matrix, as a row if\n\
03c89ade4070 [project @ 2007-04-13 12:19:30 by jwe]
jwe
parents: 6254
diff changeset
462 @var{x} is a row or as a column otherwise. To obtain a single index for\n\
03c89ade4070 [project @ 2007-04-13 12:19:30 by jwe]
jwe
parents: 6254
diff changeset
463 each matrix element, Octave pretends that the columns of a matrix form one\n\
03c89ade4070 [project @ 2007-04-13 12:19:30 by jwe]
jwe
parents: 6254
diff changeset
464 long vector (like Fortran arrays are stored). For example,\n\
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
465 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
466 @example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
467 @group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
468 find (eye (2))\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
469 @result{} [ 1; 4 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
470 @end group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
471 @end example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
472 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
473 If two outputs are requested, @code{find} returns the row and column\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
474 indices of nonzero elements of a matrix. For example,\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
475 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
476 @example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
477 @group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
478 [i, j] = find (2 * eye (2))\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
479 @result{} i = [ 1; 2 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
480 @result{} j = [ 1; 2 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
481 @end group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
482 @end example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
483 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
484 If three outputs are requested, @code{find} also returns a vector\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
485 containing the nonzero values. For example,\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
486 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
487 @example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
488 @group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
489 [i, j, v] = find (3 * eye (2))\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
490 @result{} i = [ 1; 2 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
491 @result{} j = [ 1; 2 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
492 @result{} v = [ 3; 3 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
493 @end group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
494 @end example\n\
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
495 \n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
496 If two inputs are given, @var{n} indicates the number of elements to\n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
497 find from the beginning of the matrix or vector.\n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
498 \n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
499 If three inputs are given, @var{direction} should be one of \"first\" or\n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
500 \"last\" indicating that it should start counting found elements from the\n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
501 first or last element.\n\
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
502 \n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
503 Note that this function is particularly useful for sparse matrices, as\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
504 it extracts the non-zero elements as vectors, which can then be used to\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
505 create the original matrix. For example,\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
506 \n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
507 @example\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
508 @group\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
509 sz = size(a);\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
510 [i, j, v] = find (a);\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
511 b = sparse(i, j, v, sz(1), sz(2));\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
512 @end group\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
513 @end example\n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
514 @seealso{sparse}\n\
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
515 @end deftypefn")
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
516 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
517 octave_value_list retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
518
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
519 int nargin = args.length ();
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
520
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
521 if (nargin > 3 || nargin < 1)
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
522 {
5823
080c08b192d8 [project @ 2006-05-19 05:32:17 by jwe]
jwe
parents: 5307
diff changeset
523 print_usage ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
524 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
525 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
526
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
527 // Setup the default options.
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
528 octave_idx_type n_to_find = -1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
529 if (nargin > 1)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
530 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
531 n_to_find = args(1).int_value ();
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
532 if (error_state)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
533 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
534 error ("find: expecting second argument to be an integer");
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
535 return retval;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
536 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
537 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
538
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
539 // Direction to do the searching (1 == forward, -1 == reverse).
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
540 int direction = 1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
541 if (nargin > 2)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
542 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
543 direction = 0;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
544
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
545 std::string s_arg = args(2).string_value ();
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
546
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
547 if (! error_state)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
548 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
549 if (s_arg == "first")
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
550 direction = 1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
551 else if (s_arg == "last")
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
552 direction = -1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
553 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
554
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
555 if (direction == 0)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
556 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
557 error ("find: expecting third argument to be \"first\" or \"last\"");
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
558 return retval;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
559 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
560 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
561
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
562 octave_value arg = args(0);
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
563
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
564 if (arg.is_sparse_type ())
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
565 {
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
566 if (arg.is_real_type ())
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
567 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
568 SparseMatrix v = arg.sparse_matrix_value ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
569
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
570 if (! error_state)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
571 retval = find_nonzero_elem_idx (v, nargout,
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
572 n_to_find, direction);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
573 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
574 else if (arg.is_complex_type ())
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
575 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
576 SparseComplexMatrix v = arg.sparse_complex_matrix_value ();
5107
c891dd97b837 [project @ 2005-01-12 19:49:18 by jwe]
jwe
parents: 4826
diff changeset
577
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
578 if (! error_state)
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
579 retval = find_nonzero_elem_idx (v, nargout,
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
580 n_to_find, direction);
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
581 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
582 else
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
583 gripe_wrong_type_arg ("find", arg);
5107
c891dd97b837 [project @ 2005-01-12 19:49:18 by jwe]
jwe
parents: 4826
diff changeset
584 }
8955
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
585 else if (arg.is_perm_matrix ()) {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
586 PermMatrix P = arg.perm_matrix_value ();
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
587
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
588 if (! error_state)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
589 retval = find_nonzero_elem_idx (P, nargout, n_to_find, direction);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
590 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
591 else
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
592 {
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
593 if (arg.is_single_type ())
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
594 {
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
595 if (arg.is_real_type ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
596 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
597 FloatNDArray nda = arg.float_array_value ();
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
598
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
599 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
600 retval = find_nonzero_elem_idx (nda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
601 n_to_find, direction);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
602 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
603 else if (arg.is_complex_type ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
604 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
605 FloatComplexNDArray cnda = arg.float_complex_array_value ();
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
606
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
607 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
608 retval = find_nonzero_elem_idx (cnda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
609 n_to_find, direction);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
610 }
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
611 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
612 else
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
613 {
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
614 if (arg.is_real_type ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
615 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
616 NDArray nda = arg.array_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
617
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
618 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
619 retval = find_nonzero_elem_idx (nda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
620 n_to_find, direction);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
621 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
622 else if (arg.is_complex_type ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
623 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
624 ComplexNDArray cnda = arg.complex_array_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
625
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
626 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
627 retval = find_nonzero_elem_idx (cnda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
628 n_to_find, direction);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
629 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
630 else if (arg.is_string ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
631 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
632 charNDArray cnda = arg.char_array_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
633
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
634 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
635 retval = find_nonzero_elem_idx (cnda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
636 n_to_find, direction);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
637 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
638 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
639 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
640 gripe_wrong_type_arg ("find", arg);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
641 }
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
642 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
643 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
644
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
645 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
646 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
647
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
648 /*
7814
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
649 %!assert(find ([1, 0, 1, 0, 1]), [1, 3, 5]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
650 %!assert(find ([1; 0; 3; 0; 1]), [1; 3; 5]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
651 %!assert(find ([0, 0, 2; 0, 3, 0; -1, 0, 0]), [3; 5; 7]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
652
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
653 %!test
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
654 %! [i, j, v] = find ([0, 0, 2; 0, 3, 0; -1, 0, 0]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
655 %!
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
656 %! assert(i, [3; 2; 1]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
657 %! assert(j, [1; 2; 3]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
658 %! assert(v, [-1; 3; 2]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
659
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
660 %!assert(find (single([1, 0, 1, 0, 1])), [1, 3, 5]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
661 %!assert(find (single([1; 0; 3; 0; 1])), [1; 3; 5]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
662 %!assert(find (single([0, 0, 2; 0, 3, 0; -1, 0, 0])), [3; 5; 7]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
663
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
664 %!test
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
665 %! [i, j, v] = find (single([0, 0, 2; 0, 3, 0; -1, 0, 0]));
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
666 %!
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
667 %! assert(i, [3; 2; 1]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
668 %! assert(j, [1; 2; 3]);
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
669 %! assert(v, single([-1; 3; 2]));
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
670
8955
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
671 %!test
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
672 %! pcol = [5 1 4 3 2];
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
673 %! P = eye (5) (:, pcol);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
674 %! [i, j, v] = find (P);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
675 %! [ifull, jfull, vfull] = find (full (P));
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
676 %! assert (i, ifull);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
677 %! assert (j, jfull);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
678 %! assert (all (v == 1));
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
679
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
680 %!test
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
681 %! prow = [5 1 4 3 2];
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
682 %! P = eye (5) (prow, :);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
683 %! [i, j, v] = find (P);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
684 %! [ifull, jfull, vfull] = find (full (P));
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
685 %! assert (i, ifull);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
686 %! assert (j, jfull);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
687 %! assert (all (v == 1));
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
688
7814
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
689 %!error <Invalid call to find.*> find ();
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
690
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
691 */
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
692
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
693 /*
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
694 ;;; Local Variables: ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
695 ;;; mode: C++ ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
696 ;;; End: ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
697 */