// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "find.h" #include "verbose.h" template < typename T, typename DerivedI, typename DerivedJ, typename DerivedV> IGL_INLINE void igl::find( const Eigen::SparseMatrix& X, Eigen::MatrixBase & I, Eigen::MatrixBase & J, Eigen::MatrixBase & V) { // Resize outputs to fit nonzeros I.derived().resize(X.nonZeros(),1); J.derived().resize(X.nonZeros(),1); V.derived().resize(X.nonZeros(),1); int i = 0; // Iterate over outside for(int k=0; k::InnerIterator it (X,k); it; ++it) { V(i) = it.value(); I(i) = it.row(); J(i) = it.col(); i++; } } } template IGL_INLINE void igl::find( const Eigen::SparseVector& X, Eigen::Matrix & I, Eigen::Matrix & V) { // Resize outputs to fit nonzeros I.resize(X.nonZeros()); V.resize(X.nonZeros()); int i = 0; // loop over non-zeros for(typename Eigen::SparseVector::InnerIterator it(X); it; ++it) { I(i) = it.index(); V(i) = it.value(); i++; } } #ifndef IGL_HEADER_ONLY // Explicit template specialization // generated by autoexplicit.sh template void igl::find, Eigen::Matrix, Eigen::Matrix >(Eigen::SparseMatrix const&, Eigen::MatrixBase >&, Eigen::MatrixBase >&, Eigen::MatrixBase >&); template void igl::find, Eigen::Matrix, Eigen::Matrix >(Eigen::SparseMatrix const&, Eigen::MatrixBase >&, Eigen::MatrixBase >&, Eigen::MatrixBase >&); // generated by autoexplicit.sh #endif