// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_find //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result find(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline const mtOp find(const Base& X, const uword k, const char* direction = "first") { arma_extra_debug_sigprint(); const char sig = (direction != nullptr) ? direction[0] : char(0); arma_debug_check ( ( (sig != 'f') && (sig != 'F') && (sig != 'l') && (sig != 'L') ), "find(): direction must be \"first\" or \"last\"" ); const uword type = ( (sig == 'f') || (sig == 'F') ) ? 0 : 1; return mtOp(X.get_ref(), k, type); } // template arma_warn_unused inline uvec find(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find(R); } template arma_warn_unused inline uvec find(const BaseCube& X, const uword k, const char* direction = "first") { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find(R, k, direction); } template arma_warn_unused inline uvec find(const mtOpCube& X, const uword k = 0, const char* direction = "first") { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.m); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find( mtOp, op_rel_type>(R, X.aux), k, direction ); } template arma_warn_unused inline uvec find(const mtGlueCube& X, const uword k = 0, const char* direction = "first") { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; const unwrap_cube tmp1(X.A); const unwrap_cube tmp2(X.B); arma_debug_assert_same_size( tmp1.M, tmp2.M, "relational operator" ); const Mat R1( const_cast< eT1* >(tmp1.M.memptr()), tmp1.M.n_elem, 1, false ); const Mat R2( const_cast< eT2* >(tmp2.M.memptr()), tmp2.M.n_elem, 1, false ); return find( mtGlue, Mat, glue_rel_type>(R1, R2), k, direction ); } // template arma_warn_unused inline Col find(const SpBase& X, const uword k = 0) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); const uword n_rows = P.get_n_rows(); const uword n_nz = P.get_n_nonzero(); Mat tmp(n_nz, 1, arma_nozeros_indicator()); uword* tmp_mem = tmp.memptr(); typename SpProxy::const_iterator_type it = P.begin(); for(uword i=0; i out; const uword count = (k == 0) ? uword(n_nz) : uword( (std::min)(n_nz, k) ); out.steal_mem_col(tmp, count); return out; } template arma_warn_unused inline Col find(const SpBase& X, const uword k, const char* direction) { arma_extra_debug_sigprint(); arma_ignore(X); arma_ignore(k); arma_ignore(direction); arma_check(true, "find(SpBase,k,direction): not implemented yet"); // TODO Col out; return out; } // template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result find_finite(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result find_nonfinite(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result find_nan(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } // template arma_warn_unused inline uvec find_finite(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find_finite(R); } template arma_warn_unused inline uvec find_nonfinite(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find_nonfinite(R); } template arma_warn_unused inline uvec find_nan(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find_nan(R); } // template arma_warn_unused inline Col find_finite(const SpBase& X) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); const uword n_rows = P.get_n_rows(); const uword n_nz = P.get_n_nonzero(); Mat tmp(n_nz, 1, arma_nozeros_indicator()); uword* tmp_mem = tmp.memptr(); typename SpProxy::const_iterator_type it = P.begin(); uword count = 0; for(uword i=0; i out; if(count > 0) { out.steal_mem_col(tmp, count); } return out; } template arma_warn_unused inline Col find_nonfinite(const SpBase& X) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); const uword n_rows = P.get_n_rows(); const uword n_nz = P.get_n_nonzero(); Mat tmp(n_nz, 1, arma_nozeros_indicator()); uword* tmp_mem = tmp.memptr(); typename SpProxy::const_iterator_type it = P.begin(); uword count = 0; for(uword i=0; i out; if(count > 0) { out.steal_mem_col(tmp, count); } return out; } template arma_warn_unused inline Col find_nan(const SpBase& X) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); const uword n_rows = P.get_n_rows(); const uword n_nz = P.get_n_nonzero(); Mat tmp(n_nz, 1, arma_nozeros_indicator()); uword* tmp_mem = tmp.memptr(); typename SpProxy::const_iterator_type it = P.begin(); uword count = 0; for(uword i=0; i out; if(count > 0) { out.steal_mem_col(tmp, count); } return out; } //! @}