PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
FilterEigenvalues.h
1#ifndef PBAT_MATH_LINALG_FILTEREIGENVALUES_H
2#define PBAT_MATH_LINALG_FILTEREIGENVALUES_H
3
4#include <Eigen/Core>
5#include <Eigen/Eigenvalues>
6
8
13 None, // No filter
14 SpdProjection, // Project to nearest (in the 2-norm) SPD matrix
15 FlipNegative, // Flip negative eigenvalue signs
16};
17
29template <class TDerivedA, class TDerivedB>
31 Eigen::MatrixBase<TDerivedA> const& A,
33 Eigen::MatrixBase<TDerivedB>& B)
34{
35 switch (mode)
36 {
37 using ScalarType = typename TDerivedA::Scalar;
38 using MatrixType =
39 Eigen::Matrix<ScalarType, TDerivedA::RowsAtCompileTime, TDerivedA::ColsAtCompileTime>;
40 case EEigenvalueFilter::None: {
41 B = A;
42 return true;
43 }
44 case EEigenvalueFilter::SpdProjection: {
45 Eigen::SelfAdjointEigenSolver<MatrixType> eig{};
46 eig.compute(A, Eigen::ComputeEigenvectors);
47 if (eig.info() != Eigen::Success)
48 {
49 return false;
50 }
51 auto D = eig.eigenvalues();
52 auto V = eig.eigenvectors();
53 for (auto i = 0; i < D.size(); ++i)
54 {
55 if (D(i) >= 0)
56 break;
57 D(i) = ScalarType(0);
58 }
59 B = V * D.asDiagonal() * V.transpose();
60 return Eigen::Success;
61 }
62 case EEigenvalueFilter::FlipNegative: {
63 Eigen::SelfAdjointEigenSolver<MatrixType> eig{};
64 eig.compute(A, Eigen::ComputeEigenvectors);
65 if (eig.info() != Eigen::Success)
66 {
67 return false;
68 }
69 auto D = eig.eigenvalues();
70 auto V = eig.eigenvectors();
71 for (auto i = 0; i < D.size(); ++i)
72 {
73 if (D(i) >= 0)
74 break;
75 D(i) = -D(i);
76 }
77 B = V * D.asDiagonal() * V.transpose();
78 return true;
79 }
80 default: return false;
81 }
82}
83
84} // namespace pbat::math::linalg
85
86#endif // PBAT_MATH_LINALG_FILTEREIGENVALUES_H
Linear Algebra related functionality.
Definition FilterEigenvalues.h:7
EEigenvalueFilter
Bit-flag enum for SPD projection type.
Definition FilterEigenvalues.h:12
bool FilterEigenvalues(Eigen::MatrixBase< TDerivedA > const &A, EEigenvalueFilter mode, Eigen::MatrixBase< TDerivedB > &B)
Filter eigenvalues of a symmetric matrix A and store the result in B.
Definition FilterEigenvalues.h:30