find.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "find.h"
  2. #include "verbose.h"
  3. template <
  4. typename T,
  5. typename DerivedI,
  6. typename DerivedJ,
  7. typename DerivedV>
  8. IGL_INLINE void igl::find(
  9. const Eigen::SparseMatrix<T>& X,
  10. Eigen::MatrixBase<DerivedI> & I,
  11. Eigen::MatrixBase<DerivedJ> & J,
  12. Eigen::MatrixBase<DerivedV> & V)
  13. {
  14. // Resize outputs to fit nonzeros
  15. I.derived().resize(X.nonZeros(),1);
  16. J.derived().resize(X.nonZeros(),1);
  17. V.derived().resize(X.nonZeros(),1);
  18. int i = 0;
  19. // Iterate over outside
  20. for(int k=0; k<X.outerSize(); ++k)
  21. {
  22. // Iterate over inside
  23. for(typename Eigen::SparseMatrix<T>::InnerIterator it (X,k); it; ++it)
  24. {
  25. V(i) = it.value();
  26. I(i) = it.row();
  27. J(i) = it.col();
  28. i++;
  29. }
  30. }
  31. }
  32. template <typename T>
  33. IGL_INLINE void igl::find(
  34. const Eigen::SparseVector<T>& X,
  35. Eigen::Matrix<int,Eigen::Dynamic,1> & I,
  36. Eigen::Matrix<T,Eigen::Dynamic,1> & V)
  37. {
  38. // Resize outputs to fit nonzeros
  39. I.resize(X.nonZeros());
  40. V.resize(X.nonZeros());
  41. int i = 0;
  42. // loop over non-zeros
  43. for(typename Eigen::SparseVector<T>::InnerIterator it(X); it; ++it)
  44. {
  45. I(i) = it.index();
  46. V(i) = it.value();
  47. i++;
  48. }
  49. }
  50. #ifndef IGL_HEADER_ONLY
  51. // Explicit template specialization
  52. // generated by autoexplicit.sh
  53. template void igl::find<double, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
  54. template void igl::find<double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
  55. // generated by autoexplicit.sh
  56. #endif