#ifndef IGL_SORT_H #define IGL_SORT_H #include "igl_inline.h" #include #include namespace igl { // Sort the elements of a matrix X along a given dimension like matlabs sort // function // // Templates: // DerivedX derived scalar type, e.g. MatrixXi or MatrixXd // DerivedIX derived integer type, e.g. MatrixXi // Inputs: // X m by n matrix whose entries are to be sorted // dim dimensional along which to sort: // 1 sort each column (matlab default) // 2 sort each row // ascending sort ascending (true, matlab default) or descending (false) // Outputs: // Y m by n matrix whose entries are sorted // IX m by n matrix of indices so that if dim = 1, then in matlab notation // for j = 1:n, Y(:,j) = X(I(:,j),j); end template IGL_INLINE void sort( const Eigen::PlainObjectBase& X, const int dim, const bool ascending, Eigen::PlainObjectBase& Y, Eigen::PlainObjectBase& IX); // Act like matlab's [Y,I] = SORT(X) for std library vectors // Templates: // T should be a class that implements the '<' comparator operator // Input: // unsorted unsorted vector // ascending sort ascending (true, matlab default) or descending (false) // Output: // sorted sorted vector, allowed to be same as unsorted // index_map an index map such that sorted[i] = unsorted[index_map[i]] template IGL_INLINE void sort( const std::vector &unsorted, const bool ascending, std::vector &sorted, std::vector &index_map); } #ifdef IGL_HEADER_ONLY # include "sort.cpp" #endif #endif