// 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 "slice_into.h" #include "colon.h" // Bug in unsupported/Eigen/SparseExtra needs iostream first #include #include template IGL_INLINE void igl::slice_into( const Eigen::SparseMatrix& X, const Eigen::Matrix & R, const Eigen::Matrix & C, Eigen::SparseMatrix& Y) { #ifndef NDEBUG int xm = X.rows(); int xn = X.cols(); assert(R.size() == xm); assert(C.size() == xn); int ym = Y.rows(); int yn = Y.cols(); assert(R.minCoeff() >= 0); assert(R.maxCoeff() < ym); assert(C.minCoeff() >= 0); assert(C.maxCoeff() < yn); #endif // create temporary dynamic sparse matrix Eigen::DynamicSparseMatrix dyn_Y(Y); // Iterate over outside for(int k=0; k::InnerIterator it (X,k); it; ++it) { dyn_Y.coeffRef(R(it.row()),C(it.col())) = it.value(); } } Y = Eigen::SparseMatrix(dyn_Y); } template IGL_INLINE void igl::slice_into( const Eigen::DenseBase & X, const Eigen::Matrix & R, const Eigen::Matrix & C, Eigen::PlainObjectBase & Y) { int xm = X.rows(); int xn = X.cols(); #ifndef NDEBUG assert(R.size() == xm); assert(C.size() == xn); int ym = Y.rows(); int yn = Y.cols(); assert(R.minCoeff() >= 0); assert(R.maxCoeff() < ym); assert(C.minCoeff() >= 0); assert(C.maxCoeff() < yn); #endif // Build reindexing maps for columns and rows, -1 means not in map Eigen::Matrix RI; RI.resize(xm); for(int i = 0;i IGL_INLINE void igl::slice_into( const MatX& X, const Eigen::Matrix & R, const int dim, MatY& Y) { Eigen::VectorXi C; switch(dim) { case 1: assert(R.size() == X.rows()); // boring base case if(X.cols() == 0) { return; } igl::colon(0,X.cols()-1,C); return slice_into(X,R,C,Y); case 2: assert(R.size() == X.cols()); // boring base case if(X.rows() == 0) { return; } igl::colon(0,X.rows()-1,C); return slice_into(X,C,R,Y); default: assert(false && "Unsupported dimension"); return; } } template IGL_INLINE void igl::slice_into( const Eigen::DenseBase & X, const Eigen::Matrix & R, Eigen::PlainObjectBase & Y) { // phony column indices Eigen::Matrix C; C.resize(1); C(0) = 0; return igl::slice_into(X,R,C,Y); } #ifdef IGL_STATIC_LIBRARY // Explicit template instantiation // generated by autoexplicit.sh template void igl::slice_into, Eigen::Matrix >(Eigen::Matrix const&, Eigen::Matrix const&, int, Eigen::Matrix&); // generated by autoexplicit.sh template void igl::slice_into, Eigen::PlainObjectBase > >(Eigen::Matrix const&, Eigen::Matrix const&, int, Eigen::PlainObjectBase >&); // generated by autoexplicit.sh template void igl::slice_into, -1, -1, true>, Eigen::PlainObjectBase > >(Eigen::Block, -1, -1, true> const&, Eigen::Matrix const&, int, Eigen::PlainObjectBase >&); // generated by autoexplicit.sh template void igl::slice_into, Eigen::PlainObjectBase > >(Eigen::Matrix const&, Eigen::Matrix const&, int, Eigen::PlainObjectBase >&); // generated by autoexplicit.sh template void igl::slice_into, Eigen::PlainObjectBase > >(Eigen::Matrix const&, Eigen::Matrix const&, int, Eigen::PlainObjectBase >&); template void igl::slice_into(Eigen::SparseMatrix const&, Eigen::Matrix const&, Eigen::Matrix const&, Eigen::SparseMatrix&); template void igl::slice_into, Eigen::Matrix >(Eigen::Matrix const&, Eigen::Matrix const&, int, Eigen::Matrix&); template void igl::slice_into, Eigen::Matrix >(Eigen::DenseBase > const&, Eigen::Matrix const&, Eigen::PlainObjectBase >&); template void igl::slice_into, Eigen::Matrix >(Eigen::Matrix const&, Eigen::Matrix const&, int, Eigen::Matrix&); template void igl::slice_into, Eigen::Matrix >(Eigen::DenseBase > const&, Eigen::Matrix const&, Eigen::PlainObjectBase >&); template void igl::slice_into, Eigen::SparseMatrix >(Eigen::SparseMatrix const&, Eigen::Matrix const&, int, Eigen::SparseMatrix&); template void igl::slice_into(Eigen::SparseMatrix const&, Eigen::Matrix const&, Eigen::Matrix const&, Eigen::SparseMatrix&); template void igl::slice_into, Eigen::Matrix >(Eigen::DenseBase > const&, Eigen::Matrix const&, Eigen::PlainObjectBase >&); template void igl::slice_into, Eigen::Matrix >(Eigen::DenseBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, Eigen::PlainObjectBase >&); template void igl::slice_into, Eigen::Matrix >(Eigen::Matrix const&, Eigen::Matrix const&, int, Eigen::Matrix&); template void igl::slice_into, Eigen::Matrix >(Eigen::DenseBase > const&, Eigen::Matrix const&, Eigen::PlainObjectBase >&); #endif