annotate src/DLD-FUNCTIONS/find.cc @ 9028:e67dc11ed6e8

use Array<T>::find in find
author Jaroslav Hajek <highegg@gmail.com>
date Thu, 26 Mar 2009 13:50:46 +0100
parents 12ca81f1fa99
children cfad8f9a77fa
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
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
46 Array<octave_idx_type> idx;
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
47 if (n_to_find >= 0)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
48 idx = nda.find (n_to_find, direction == -1);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
49 else
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
50 idx = nda.find ();
5130
3bf4c0cd775d [project @ 2005-02-08 03:01:13 by jwe]
jwe
parents: 5107
diff changeset
51
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
52 // Fixup idx dimensions, for Matlab compatibility.
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
53 // find(zeros(0,0)) -> zeros(0,0)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
54 // find(zeros(1,0)) -> zeros(1,0)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
55 // find(zeros(0,1)) -> zeros(0,1)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
56 // find(zeros(0,X)) -> zeros(0,1)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
57 // find(zeros(1,1)) -> zeros(0,0) !!!! WHY?
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
58 // find(zeros(0,1,0)) -> zeros(0,0)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
59 // find(zeros(0,1,0,1)) -> zeros(0,0) etc
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
60 // FIXME: I don't believe this is right. Matlab seems to violate its own docs
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
61 // here, because a scalar *is* a row vector.
6005
b4351cfb5659 [project @ 2006-09-26 21:38:16 by jwe]
jwe
parents: 6002
diff changeset
62
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
63 if ((nda.numel () == 1 && idx.is_empty ())
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
64 || (nda.rows () == 0 && nda.dims ().numel (1) == 0))
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
65 idx = idx.reshape (dim_vector (0, 0));
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
66 else if (nda.rows () == 1 && nda.ndims () == 2)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
67 idx = idx.reshape (dim_vector (1, idx.length ()));
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
68
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
69 switch (nargout)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
70 {
6254
5b43c2332b69 [project @ 2007-01-29 17:35:15 by jwe]
jwe
parents: 6026
diff changeset
71 default:
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
72 case 3:
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
73 retval(2) = ArrayN<T> (nda.index (idx_vector (idx)));
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
74 // Fall through!
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
75
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
76 case 2:
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
77 {
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
78 Array<octave_idx_type> jdx (idx.dims ());
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
79 octave_idx_type n = idx.length (), nr = nda.rows ();
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
80 for (octave_idx_type i = 0; i < n; i++)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
81 {
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
82 jdx.xelem (i) = idx.xelem (i) / nr;
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
83 idx.xelem (i) %= nr;
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
84 }
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
85 retval(1) = NDArray (jdx, true);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
86 }
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
87 // Fall through!
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
88
6254
5b43c2332b69 [project @ 2007-01-29 17:35:15 by jwe]
jwe
parents: 6026
diff changeset
89 case 1:
5b43c2332b69 [project @ 2007-01-29 17:35:15 by jwe]
jwe
parents: 6026
diff changeset
90 case 0:
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
91 retval(0) = NDArray (idx, true);
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
92 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
93 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
94
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
95 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
96 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
97
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
98 #define INSTANTIATE_FIND_ARRAY(T) \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
99 template octave_value_list find_nonzero_elem_idx (const Array<T>&, int, \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
100 octave_idx_type, int)
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
101
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
102 INSTANTIATE_FIND_ARRAY(double);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
103 INSTANTIATE_FIND_ARRAY(float);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
104 INSTANTIATE_FIND_ARRAY(Complex);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
105 INSTANTIATE_FIND_ARRAY(FloatComplex);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
106 INSTANTIATE_FIND_ARRAY(bool);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
107 INSTANTIATE_FIND_ARRAY(octave_int8);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
108 INSTANTIATE_FIND_ARRAY(octave_int16);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
109 INSTANTIATE_FIND_ARRAY(octave_int32);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
110 INSTANTIATE_FIND_ARRAY(octave_int64);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
111 INSTANTIATE_FIND_ARRAY(octave_uint8);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
112 INSTANTIATE_FIND_ARRAY(octave_uint16);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
113 INSTANTIATE_FIND_ARRAY(octave_uint32);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
114 INSTANTIATE_FIND_ARRAY(octave_uint64);
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
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 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
117 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
118 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
119 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
120 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
121 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
122
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
123
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
124 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
125 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
126 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
127
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
128 // 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
129 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
130 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
131 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
132
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
133 // 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
134 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
135 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
136 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
137 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
138 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
139 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
140 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
141 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
142 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
143 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
144 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
145 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
146 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
147 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
148 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
149 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
150 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
151 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
152 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
153 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
154 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
155 else
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
156 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
157 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
158 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
159 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
160 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
161 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
162 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
163 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
164 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
165 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
166 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
167 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
168 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
169
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
170 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
171 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
172
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
173 // 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
174 // 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
175 // case...
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
176
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
177 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
178 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
179
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
180 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
181
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
182 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
183 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
184 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
185 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
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 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
188 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
189
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
190 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
191
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
192 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
193 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
194
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
195 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
196
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
197 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
198 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
199 // 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
200 // 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
201 // 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
202 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
203 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
204 {
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_QUIT;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
206 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
207 continue;
8810
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
208 i_idx(cx) = static_cast<double> (v.ridx(i) + 1);
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
209 j_idx(cx) = static_cast<double> (j + 1);
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
210 idx(cx) = j * nr + v.ridx(i) + 1;
c9e1db15035b eliminate unnecessary casts
John W. Eaton <jwe@octave.org>
parents: 7814
diff changeset
211 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
212 cx++;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
213 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
214 break;
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 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
217 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
218 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
219 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
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 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
222 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
223
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
224 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
225 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
226
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
227 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
228 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
229 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
230 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
231 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
232 break;
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 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
235 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
236 // 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
237
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
238 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
239 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
240 // 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
241
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
242 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
243 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
244 // 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
245
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
246 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
247 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
248 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
249 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
250
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
251 default:
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
252 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
253 break;
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
254 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
255
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
256 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
257 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
258
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
259 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
260 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
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 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
263 octave_idx_type, int);
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
264
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
265 template octave_value_list find_nonzero_elem_idx (const Sparse<bool>&, int,
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
266 octave_idx_type, int);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
267
8955
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
268 octave_value_list
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
269 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
270 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
271 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
272 // 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
273 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
274
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
275 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
276 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
277
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
278 // 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
279 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
280 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
281 start_nc = 0;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
282 end_nc = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
283 n_to_find = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
284 count = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
285 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
286 else if (direction > 0)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
287 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
288 start_nc = 0;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
289 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
290 count = n_to_find;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
291 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
292 else
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
293 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
294 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
295 end_nc = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
296 count = n_to_find;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
297 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
298
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
299 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
300
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
301 Matrix idx (count, 1);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
302 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
303 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
304 // Every value is 1.
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
305 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
306
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
307 if (count > 0)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
308 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
309 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
310 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
311 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
312 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
313 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
314 OCTAVE_QUIT;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
315 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
316 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
317 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
318 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
319 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
320 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
321 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
322 else
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
323 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
324 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
325 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
326 OCTAVE_QUIT;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
327 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
328 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
329 // 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
330 // 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
331 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
332 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
333 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
334 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
335 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
336 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
337 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
338 else if (scalar_arg)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
339 {
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
340 // 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
341 idx.resize (0, 0);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
342 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
343 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
344 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
345 }
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
346
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
347 switch (nargout)
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 case 0:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
350 case 1:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
351 retval(0) = idx;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
352 break;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
353
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
354 case 5:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
355 retval(4) = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
356 // Fall through
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 case 4:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
359 retval(3) = nc;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
360 // Fall through
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
361
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
362 case 3:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
363 retval(2) = val;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
364 // Fall through!
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
365
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
366 case 2:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
367 retval(1) = j_idx;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
368 retval(0) = i_idx;
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
369 break;
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 default:
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
372 panic_impossible ();
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
373 break;
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 return retval;
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
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
379 DEFUN_DLD (find, args, nargout,
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
380 "-*- texinfo -*-\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
381 @deftypefn {Loadable Function} {} find (@var{x})\n\
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
382 @deftypefnx {Loadable Function} {} find (@var{x}, @var{n})\n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
383 @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
384 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
385 @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
386 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
387 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
388 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
389 @example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
390 @group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
391 find (eye (2))\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
392 @result{} [ 1; 4 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
393 @end group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
394 @end example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
395 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
396 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
397 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
398 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
399 @example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
400 @group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
401 [i, j] = find (2 * eye (2))\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
402 @result{} i = [ 1; 2 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
403 @result{} j = [ 1; 2 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
404 @end group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
405 @end example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
406 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
407 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
408 containing the nonzero values. For example,\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
409 \n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
410 @example\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
411 @group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
412 [i, j, v] = find (3 * eye (2))\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
413 @result{} i = [ 1; 2 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
414 @result{} j = [ 1; 2 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
415 @result{} v = [ 3; 3 ]\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
416 @end group\n\
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
417 @end example\n\
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
418 \n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
419 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
420 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
421 \n\
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
422 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
423 \"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
424 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
425 \n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
426 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
427 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
428 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
429 \n\
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
430 @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
431 @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
432 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
433 [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
434 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
435 @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
436 @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
437 @seealso{sparse}\n\
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 3014
diff changeset
438 @end deftypefn")
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
439 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
440 octave_value_list retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
441
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
442 int nargin = args.length ();
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
443
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
444 if (nargin > 3 || nargin < 1)
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
445 {
5823
080c08b192d8 [project @ 2006-05-19 05:32:17 by jwe]
jwe
parents: 5307
diff changeset
446 print_usage ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
447 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
448 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
449
6002
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
450 // Setup the default options.
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
451 octave_idx_type n_to_find = -1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
452 if (nargin > 1)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
453 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
454 n_to_find = args(1).int_value ();
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
455 if (error_state)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
456 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
457 error ("find: expecting second argument to be an integer");
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
458 return retval;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
459 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
460 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
461
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
462 // Direction to do the searching (1 == forward, -1 == reverse).
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
463 int direction = 1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
464 if (nargin > 2)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
465 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
466 direction = 0;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
467
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
468 std::string s_arg = args(2).string_value ();
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
469
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
470 if (! error_state)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
471 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
472 if (s_arg == "first")
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
473 direction = 1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
474 else if (s_arg == "last")
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
475 direction = -1;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
476 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
477
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
478 if (direction == 0)
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
479 {
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
480 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
481 return retval;
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
482 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
483 }
c5d0490aad55 [project @ 2006-09-26 19:45:42 by jwe]
jwe
parents: 5823
diff changeset
484
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
485 octave_value arg = args(0);
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
486
9028
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
487 if (arg.is_bool_type ())
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
488 {
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
489 if (arg.is_sparse_type ())
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
490 {
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
491 SparseBoolMatrix v = arg.sparse_bool_matrix_value ();
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
492
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
493 if (! error_state)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
494 retval = find_nonzero_elem_idx (v, nargout,
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
495 n_to_find, direction);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
496 }
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
497 else
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
498 {
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
499 boolNDArray v = arg.bool_array_value ();
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
500
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
501 if (! error_state)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
502 retval = find_nonzero_elem_idx (v, nargout,
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
503 n_to_find, direction);
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
504 }
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
505 }
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
506 else if (arg.is_integer_type ())
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
507 {
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
508 #define DO_INT_BRANCH(INTT) \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
509 else if (arg.is_ ## INTT ## _type ()) \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
510 { \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
511 INTT ## NDArray v = arg.INTT ## _array_value (); \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
512 \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
513 if (! error_state) \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
514 retval = find_nonzero_elem_idx (v, nargout, \
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
515 n_to_find, direction);\
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
516 }
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
517
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
518 if (false)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
519 ;
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
520 DO_INT_BRANCH (int8)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
521 DO_INT_BRANCH (int16)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
522 DO_INT_BRANCH (int32)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
523 DO_INT_BRANCH (int64)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
524 DO_INT_BRANCH (uint8)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
525 DO_INT_BRANCH (uint16)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
526 DO_INT_BRANCH (uint32)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
527 DO_INT_BRANCH (uint64)
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
528 else
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
529 panic_impossible ();
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
530 }
e67dc11ed6e8 use Array<T>::find in find
Jaroslav Hajek <highegg@gmail.com>
parents: 9019
diff changeset
531 else if (arg.is_sparse_type ())
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
532 {
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
533 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
534 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
535 SparseMatrix v = arg.sparse_matrix_value ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
536
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
537 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
538 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
539 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
540 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
541 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
542 {
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
543 SparseComplexMatrix v = arg.sparse_complex_matrix_value ();
5107
c891dd97b837 [project @ 2005-01-12 19:49:18 by jwe]
jwe
parents: 4826
diff changeset
544
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
545 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
546 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
547 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
548 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
549 else
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
550 gripe_wrong_type_arg ("find", arg);
5107
c891dd97b837 [project @ 2005-01-12 19:49:18 by jwe]
jwe
parents: 4826
diff changeset
551 }
8955
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
552 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
553 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
554
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
555 if (! error_state)
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
556 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
557 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
558 else
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
559 {
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
560 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
561 {
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
562 if (arg.is_real_type ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
563 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
564 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
565
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
566 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
567 retval = find_nonzero_elem_idx (nda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
568 n_to_find, direction);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
569 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
570 else if (arg.is_complex_type ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
571 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
572 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
573
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
574 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
575 retval = find_nonzero_elem_idx (cnda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
576 n_to_find, direction);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
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 }
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
579 else
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
580 {
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
581 if (arg.is_real_type ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
582 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
583 NDArray nda = arg.array_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
584
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
585 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
586 retval = find_nonzero_elem_idx (nda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
587 n_to_find, direction);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
588 }
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
589 else if (arg.is_complex_type ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
590 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
591 ComplexNDArray cnda = arg.complex_array_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
592
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
593 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
594 retval = find_nonzero_elem_idx (cnda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
595 n_to_find, direction);
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 else if (arg.is_string ())
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
598 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
599 charNDArray cnda = arg.char_array_value ();
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
600
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
601 if (! error_state)
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
602 retval = find_nonzero_elem_idx (cnda, nargout,
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
603 n_to_find, direction);
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 else
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
606 {
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
607 gripe_wrong_type_arg ("find", arg);
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7505
diff changeset
608 }
7505
f5005d9510f4 Remove dispatched sparse functions and treat in the generic versions of the functions
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
609 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
610 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
611
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
612 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
613 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
614
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
615 /*
7814
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
616 %!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
617 %!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
618 %!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
619
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
620 %!test
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
621 %! [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
622 %!
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
623 %! 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
624 %! 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
625 %! 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
626
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
627 %!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
628 %!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
629 %!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
630
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
631 %!test
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
632 %! [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
633 %!
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
634 %! 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
635 %! 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
636 %! 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
637
8955
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
638 %!test
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
639 %! 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
640 %! P = eye (5) (:, pcol);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
641 %! [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
642 %! [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
643 %! assert (i, ifull);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
644 %! assert (j, jfull);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
645 %! assert (all (v == 1));
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
646
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
647 %!test
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
648 %! 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
649 %! P = eye (5) (prow, :);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
650 %! [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
651 %! [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
652 %! assert (i, ifull);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
653 %! assert (j, jfull);
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
654 %! assert (all (v == 1));
6d3fcbf89267 Add an override to Octave's find() for permutation matrices.
Jason Riedy <jason@acm.org>
parents: 8920
diff changeset
655
7814
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
656 %!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
657
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
658 */
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 /*
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
661 ;;; Local Variables: ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
662 ;;; mode: C++ ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
663 ;;; End: ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
664 */