#include "invert_diag.h" template IGL_INLINE void igl::invert_diag( const Eigen::SparseMatrix& X, Eigen::SparseMatrix& Y) { #ifndef NDEBUG typename Eigen::SparseVector dX = X.diagonal().sparseView(); // Check that there are no zeros along the diagonal assert(dX.nonZeros() == dX.size()); #endif // http://www.alecjacobson.com/weblog/?p=2552 if(&Y != &X) { Y = X; } // Iterate over outside for(int k=0; k::InnerIterator it (Y,k); it; ++it) { if(it.col() == it.row()) { T v = it.value(); assert(v != 0); v = ((T)1.0)/v; Y.coeffRef(it.row(),it.col()) = v; } } } } #ifndef IGL_HEADER_ONLY // Explicit template specialization template void igl::invert_diag(Eigen::SparseMatrix const&, Eigen::SparseMatrix&); template void igl::invert_diag(Eigen::SparseMatrix const&, Eigen::SparseMatrix&); #endif