Chris@49: // Copyright (C) 2009-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2009-2012 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup fn_sort_index Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: struct arma_sort_index_packet Chris@49: { Chris@49: T1 val; Chris@49: T2 index; Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: class arma_sort_index_helper_ascend Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: bool Chris@49: operator() (const arma_sort_index_packet& A, const arma_sort_index_packet& B) const Chris@49: { Chris@49: return (A.val < B.val); Chris@49: } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: class arma_sort_index_helper_descend Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: bool Chris@49: operator() (const arma_sort_index_packet& A, const arma_sort_index_packet& B) const Chris@49: { Chris@49: return (A.val > B.val); Chris@49: } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: void Chris@49: inline Chris@49: sort_index_helper(umat_elem_type* out_mem, const eT* in_mem, const uword n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: std::vector< arma_sort_index_packet > packet_vec(n_elem); Chris@49: Chris@49: for(uword i=0; i Chris@49: inline Chris@49: umat Chris@49: sort_index Chris@49: ( Chris@49: const Base& X, Chris@49: const uword sort_direction = 0, Chris@49: const typename arma_not_cx::result* junk = 0 Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const unwrap tmp(X.get_ref()); Chris@49: const Mat& A = tmp.M; Chris@49: Chris@49: if(A.is_empty() == true) Chris@49: { Chris@49: return umat(); Chris@49: } Chris@49: Chris@49: arma_debug_check( (A.is_vec() == false), "sort_index(): currently only handles vectors"); Chris@49: Chris@49: typedef typename umat::elem_type out_elem_type; Chris@49: Chris@49: umat out(A.n_rows, A.n_cols); Chris@49: Chris@49: if(sort_direction == 0) Chris@49: { Chris@49: sort_index_helper(out.memptr(), A.mem, A.n_elem); Chris@49: } Chris@49: else Chris@49: { Chris@49: sort_index_helper(out.memptr(), A.mem, A.n_elem); Chris@49: } Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: umat Chris@49: stable_sort_index Chris@49: ( Chris@49: const Base& X, Chris@49: const uword sort_direction = 0, Chris@49: const typename arma_not_cx::result* junk = 0 Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(junk); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const unwrap tmp(X.get_ref()); Chris@49: const Mat& A = tmp.M; Chris@49: Chris@49: if(A.is_empty() == true) Chris@49: { Chris@49: return umat(); Chris@49: } Chris@49: Chris@49: arma_debug_check( (A.is_vec() == false), "stable_sort_index(): currently only handles vectors"); Chris@49: Chris@49: typedef typename umat::elem_type out_elem_type; Chris@49: Chris@49: umat out(A.n_rows, A.n_cols); Chris@49: Chris@49: if(sort_direction == 0) Chris@49: { Chris@49: sort_index_helper(out.memptr(), A.mem, A.n_elem); Chris@49: } Chris@49: else Chris@49: { Chris@49: sort_index_helper(out.memptr(), A.mem, A.n_elem); Chris@49: } Chris@49: Chris@49: return out; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}