polar_svd.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "polar_svd.h"
  2. #include <Eigen/SVD>
  3. // From Olga's CGAL mentee's ARAP code
  4. template<typename Mat>
  5. IGL_INLINE void igl::polar_svd(const Mat& A, Mat& R, Mat& T)
  6. {
  7. typedef Eigen::Matrix<typename Mat::Scalar,Mat::RowsAtCompileTime,1> Vec;
  8. Eigen::JacobiSVD<Mat> svd;
  9. svd.compute(A, Eigen::ComputeFullU | Eigen::ComputeFullV );
  10. const Mat& u = svd.matrixU();
  11. const Mat& v = svd.matrixV();
  12. const Vec& w = svd.singularValues();
  13. R = u*v.transpose();
  14. T = v*w.asDiagonal()*v.adjoint();
  15. }
  16. IGL_INLINE void igl::polar_svd(const Eigen::Matrix3f& A, Eigen::Matrix3f& R, Eigen::Matrix3f& T)
  17. {
  18. typedef Eigen::Matrix<Eigen::Matrix3f::Scalar,3,1> Vec;
  19. Eigen::JacobiSVD<Eigen::Matrix3f> svd;
  20. svd.compute(A, Eigen::ComputeFullU | Eigen::ComputeFullV );
  21. const Eigen::Matrix3f& u = svd.matrixU();
  22. const Eigen::Matrix3f& v = svd.matrixV();
  23. const Vec& w = svd.singularValues();
  24. R = u*v.transpose();
  25. T = v*w.asDiagonal()*v.adjoint();
  26. }
  27. // Clang is giving an annoying warning inside Eigen
  28. #ifdef __clang__
  29. # pragma clang diagnostic push
  30. # pragma clang diagnostic ignored "-Wconstant-logical-operand"
  31. #endif
  32. IGL_INLINE void igl::polar_svd(const Eigen::Matrix2f& A, Eigen::Matrix2f& R, Eigen::Matrix2f& T)
  33. {
  34. typedef Eigen::Matrix<Eigen::Matrix2f::Scalar,2,1> Vec;
  35. Eigen::JacobiSVD<Eigen::Matrix2f> svd;
  36. svd.compute(A, Eigen::ComputeFullU | Eigen::ComputeFullV );
  37. const Eigen::Matrix2f& u = svd.matrixU();
  38. const Eigen::Matrix2f& v = svd.matrixV();
  39. const Vec& w = svd.singularValues();
  40. R = u*v.transpose();
  41. T = v*w.asDiagonal()*v.adjoint();
  42. }
  43. #ifdef __clang__
  44. # pragma clang diagnostic pop
  45. #endif
  46. #ifndef IGL_HEADER_ONLY
  47. // Explicit template instanciation
  48. template void igl::polar_svd<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);
  49. #endif