17 auto SVDResult = A.jacobiSvd<Eigen::ComputeThinU | Eigen::ComputeThinV>();
19 SVDResult.setThreshold(svdTol);
20 AI = SVDResult.solve(Eigen::MatrixXd::Identity(A.rows(), A.rows()));
21 Eigen::VectorXd svs = SVDResult.singularValues().array().abs();
27 double sVmin = svdTol == 0 ? Eigen::NumTraits<real>::epsilon() : svdTol;
29 auto SVDResult = A.jacobiSvd<Eigen::ComputeThinU | Eigen::ComputeThinV>();
33 auto sVs = SVDResult.singularValues();
36 real sVsMax = SVDResult.singularValues().array().abs().maxCoeff();
38 if (std::fabs(i) > sVmin * sVsMax)
45 real sVsMin = SVDResult.singularValues().array().abs().minCoeff();
47 if (std::fabs(i) < sVsMin * sVminInv)
52 AI = SVDResult.matrixV() * sVs.asDiagonal() * SVDResult.matrixU().transpose();
53 Eigen::VectorXd svs = SVDResult.singularValues().array().abs();
56 log() << sVmin <<
" " << sVminInv << std::endl;
57 log() << sVs.transpose() << std::endl;
58 log() << svs.transpose() << std::endl;
60 << std::scientific << std::setprecision(16) << A << std::endl;
62 << std::scientific << std::setprecision(16) << AI << std::endl;
64 << std::scientific << std::setprecision(16) << SVDResult.matrixV() << std::endl;
66 << std::scientific << std::setprecision(16) << SVDResult.matrixU() << std::endl;
67 return
"EigenLeastSquareInverse_Filtered Error info"; }());
74 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> solver;
75 solver.computeDirect(A);
81 Eigen::Matrix3d ret = (solver.eigenvectors() * solver.eigenvalues().array().abs().sqrt().matrix().asDiagonal())(EigenAll, {2, 1, 0});
90 Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> solver;
91 solver.computeDirect(A);
97 Eigen::Matrix2d ret = (solver.eigenvectors() * solver.eigenvalues().array().abs().sqrt().matrix().asDiagonal())(EigenAll, {1, 0});
106 Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> solver;
107 solver.computeDirect(A);
108 Eigen::Vector2d ev = solver.eigenvalues().array().abs();
114 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> solver;
115 solver.computeDirect(A);
116 Eigen::Vector3d ev = solver.eigenvalues().array().abs();
122 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> solver;
123 solver.computeDirect(A);
124 Eigen::Vector3d ev = solver.eigenvalues().array().abs();
125 std::sort(ev.begin(), ev.end());
131 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> solver;
132 solver.computeDirect(A);
138 Eigen::Matrix3d ret = (solver.eigenvectors())(EigenAll, {2, 1, 0});
147 Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> solver;
148 solver.computeDirect(A);
154 Eigen::Matrix2d ret = (solver.eigenvectors())(EigenAll, {1, 0});
162 auto SVDResult = A.jacobiSvd<Eigen::ComputeThinU | Eigen::ComputeThinV>();
163 AIB = SVDResult.solve(B);
164 return SVDResult.rank();
#define DNDS_assert_info(expr, info)
Debug-only assertion with an extra std::string info message.
Robust linear-algebra primitives for small / moderately-sized Eigen matrices that are more numericall...
Eigen::Index EigenLeastSquareSolve(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, Eigen::MatrixXd &AIB)
Least-squares solve A * AIB ~= B via a rank-revealing QR-style decomposition; returns the computed ra...
real EigenLeastSquareInverse_Filtered(const Eigen::MatrixXd &A, Eigen::MatrixXd &AI, real svdTol, int mode)
Pseudoinverse with a choice of singular-value filter.
real Eigen3x3RealSymEigenDecompositionGetCond01(const Eigen::Matrix3d &A)
Like Eigen3x3RealSymEigenDecompositionGetCond but returns lambda0 / lambda1 only (ignores the smalles...
Eigen::Matrix3d Eigen3x3RealSymEigenDecompositionNormalized(const Eigen::Matrix3d &A)
Eigen-decomposition with eigenvector columns normalised to unit length.
Eigen::Matrix2d Eigen2x2RealSymEigenDecompositionNormalized(const Eigen::Matrix2d &A)
2x2 analogue of Eigen3x3RealSymEigenDecompositionNormalized.
Eigen::Matrix3d Eigen3x3RealSymEigenDecomposition(const Eigen::Matrix3d &A)
Analytic eigen-decomposition of a 3x3 real symmetric matrix. Returns the eigenvector matrix (columns ...
Eigen::Matrix2d Eigen2x2RealSymEigenDecomposition(const Eigen::Matrix2d &A)
Analytic 2x2 analogue of Eigen3x3RealSymEigenDecomposition.
real Eigen3x3RealSymEigenDecompositionGetCond(const Eigen::Matrix3d &A)
Condition number of a 3x3 SPD matrix from its eigenvalues.
real EigenLeastSquareInverse(const Eigen::MatrixXd &A, Eigen::MatrixXd &AI, real svdTol)
Moore-Penrose pseudoinverse via SVD, dropping singular values below svdTol (relative to the largest)....
real Eigen2x2RealSymEigenDecompositionGetCond(const Eigen::Matrix2d &A)
2x2 analogue of Eigen3x3RealSymEigenDecompositionGetCond.
DNDS_CONSTANT const real verySmallReal
Catch-all lower bound ("effectively zero").
double real
Canonical floating-point scalar used throughout DNDSR (double precision).