16 #include <Eigen/Dense>
25 using Scalar =
typename TD::Scalar;
26 static int const kMatrixDim = TD::RowsAtCompileTime;
27 static int const kM = TD::ColsAtCompileTime;
29 static_assert(kMatrixDim == kM,
"must be a square matrix");
30 static_assert(kMatrixDim >= 2,
"must have compile time dimension >= 2");
32 return (r * r.transpose() -
33 Eigen::Matrix<Scalar, kMatrixDim, kMatrixDim>::Identity())
34 .norm() < kEpsilonSqrt<Scalar>;
42 using Scalar =
typename TD::Scalar;
43 static int const kMatrixDim = TD::RowsAtCompileTime;
44 static int const kM = TD::ColsAtCompileTime;
48 Scalar det = s_r.determinant();
50 if (det <= Scalar(0)) {
54 Scalar scale_sqr = pow(det, Scalar(2. / kMatrixDim));
56 static_assert(kMatrixDim == kM,
"must be a square matrix");
57 static_assert(kMatrixDim >= 2,
"must have compile time dimension >= 2");
59 return (s_r * s_r.transpose() -
60 scale_sqr * Eigen::Matrix<Scalar, kMatrixDim, kMatrixDim>::Identity())
61 .template lpNorm<Eigen::Infinity>() < sqrt(kEpsilon<Scalar>);
68 std::is_floating_point<typename TD::Scalar>::value,
71 TD::RowsAtCompileTime,
72 TD::RowsAtCompileTime>> {
73 using Scalar =
typename TD::Scalar;
74 static int const kMatrixDim = TD::RowsAtCompileTime;
75 static int const kM = TD::ColsAtCompileTime;
77 static_assert(kMatrixDim == kM,
"must be a square matrix");
78 static_assert(kMatrixDim >= 2,
"must have compile time dimension >= 2");
80 Eigen::JacobiSVD<Eigen::Matrix<Scalar, kMatrixDim, kMatrixDim>> svd(
81 r, Eigen::ComputeFullU | Eigen::ComputeFullV);
84 Scalar d = (svd.matrixU() * svd.matrixV().transpose()).determinant();
87 Eigen::Matrix<Scalar, kMatrixDim, kMatrixDim> diag =
88 Eigen::Matrix<Scalar, kMatrixDim, kMatrixDim>::Identity();
89 diag(kMatrixDim - 1, kMatrixDim - 1) = d;
90 return svd.matrixU() * diag * svd.matrixV().transpose();