Mercurial > hg > octave-lyh
diff liboctave/Array.cc @ 9341:9fd5c56ce57a
extend lookup capabilities
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Fri, 12 Jun 2009 16:01:53 +0200 |
parents | 256c0db275b6 |
children | b096d11237be |
line wrap: on
line diff
--- a/liboctave/Array.cc +++ b/liboctave/Array.cc @@ -2470,6 +2470,56 @@ template <class T> Array<octave_idx_type> +Array<T>::lookupm (const Array<T>& values, sortmode mode) const +{ + octave_idx_type n = numel (); + octave_sort<T> lsort; + Array<octave_idx_type> idx (values.dims ()); + + if (mode == UNSORTED) + { + // auto-detect mode + if (n > 1 && lsort.descending_compare (elem (0), elem (n-1))) + mode = DESCENDING; + else + mode = ASCENDING; + } + + lsort.set_compare (mode); + + lsort.lookupm (data (), n, values.data (), values.numel (), + idx.fortran_vec ()); + + return idx; +} + +template <class T> +Array<bool> +Array<T>::lookupb (const Array<T>& values, sortmode mode) const +{ + octave_idx_type n = numel (); + octave_sort<T> lsort; + Array<bool> match (values.dims ()); + + if (mode == UNSORTED) + { + // auto-detect mode + if (n > 1 && lsort.descending_compare (elem (0), elem (n-1))) + mode = DESCENDING; + else + mode = ASCENDING; + } + + lsort.set_compare (mode); + + lsort.lookupb (data (), n, values.data (), values.numel (), + match.fortran_vec ()); + + return match; +} + +template <class T> +Array<octave_idx_type> Array<T>::find (octave_idx_type n, bool backward) const { Array<octave_idx_type> retval; @@ -2581,6 +2631,12 @@ template <> Array<octave_idx_type> \ Array<T>::lookup (const Array<T>&, sortmode, bool, bool) const \ { return Array<octave_idx_type> (); } \ +template <> Array<octave_idx_type> \ +Array<T>::lookupm (const Array<T>&, sortmode) const \ +{ return Array<octave_idx_type> (); } \ +template <> Array<bool> \ +Array<T>::lookupb (const Array<T>&, sortmode) const \ +{ return Array<bool> (); } \ template <> Array<octave_idx_type> \ Array<T>::find (octave_idx_type, bool) const\ { return Array<octave_idx_type> (); } \