30#ifndef HPP_CONSTRAINTS_SVD_HH
31#define HPP_CONSTRAINTS_SVD_HH
37namespace constraints {
38template <
typename SVD>
39static Eigen::Ref<const typename SVD::MatrixUType> getU1(
41 return svd.matrixU().leftCols(rank);
44template <
typename SVD>
45static Eigen::Ref<const typename SVD::MatrixUType> getU2(
47 return svd.matrixU().rightCols(svd.matrixU().cols() - rank);
50template <
typename SVD>
51static Eigen::Ref<const typename SVD::MatrixUType> getV1(
53 return svd.matrixV().leftCols(rank);
56template <
typename SVD>
57static Eigen::Ref<const typename SVD::MatrixUType> getV2(
59 return svd.matrixV().rightCols(svd.matrixV().cols() - rank);
62template <
typename SVD>
63static void pseudoInverse(
const SVD& svd,
64 Eigen::Ref<typename SVD::MatrixType> pinvmat) {
66 svd.computeU() && svd.computeV() &&
68 "computation flags must be at least: ComputeThinU | ComputeThinV");
71 typename SVD::SingularValuesType singularValues_inv =
72 svd.singularValues().segment(0, rank).cwiseInverse();
74 pinvmat.noalias() = getV1<SVD>(svd, rank) * singularValues_inv.asDiagonal() *
75 getU1<SVD>(svd, rank).adjoint();
78template <
typename SVD>
80 Eigen::Ref<typename SVD::MatrixType> projector) {
82 svd.computeU() && svd.computeV() &&
84 "computation flags must be at least: ComputeThinU | ComputeThinV");
87 projector.noalias() = getV1<SVD>(svd, rank) * getV1<SVD>(svd, rank).adjoint();
90template <
typename SVD>
92 Eigen::Ref<typename SVD::MatrixType> projector) {
94 svd.computeU() && svd.computeV() &&
96 "computation flags must be at least: ComputeThinU | ComputeThinV");
99 projector.noalias() = getU1<SVD>(svd, rank) * getU1<SVD>(svd, rank).adjoint();
102template <
typename SVD>
104 Eigen::Ref<typename SVD::MatrixType> projector,
105 const bool& computeFullV =
false) {
106 eigen_assert(svd.computeV() &&
108 "computation flags must be at least: ComputeThinV");
112 projector.noalias() =
113 getV2<SVD>(svd, rank) * getV2<SVD>(svd, rank).adjoint();
115 projector.noalias() =
116 -getV1<SVD>(svd, rank) * getV1<SVD>(svd, rank).adjoint();
117 projector.diagonal().noalias() += vector_t::Ones(svd.matrixV().rows());
121template <
typename SVD>
123 Eigen::Ref<typename SVD::MatrixType> projector,
124 const bool& computeFullU =
false) {
125 eigen_assert(svd.computeU() &&
127 "computation flags must be at least: ComputeThinU");
132 projector.noalias() =
133 getU2<SVD>(svd, rank) * getU2<SVD>(svd, rank).adjoint();
136 projector.noalias() =
137 -getU1<SVD>(svd, rank) * getU1<SVD>(svd, rank).adjoint();
138 projector.diagonal().noalias() += vector_t::Ones(svd.matrixU().rows());
void projectorOnSpan(const SVD &svd, Eigen::Ref< typename SVD::MatrixType > projector)
Definition svd.hh:79
void projectorOnKernelOfInv(const SVD &svd, Eigen::Ref< typename SVD::MatrixType > projector, const bool &computeFullU=false)
Definition svd.hh:122
pinocchio::size_type size_type
Definition fwd.hh:47
void projectorOnSpanOfInv(const SVD &svd, Eigen::Ref< typename SVD::MatrixType > projector)
Definition svd.hh:91
void projectorOnKernel(const SVD &svd, Eigen::Ref< typename SVD::MatrixType > projector, const bool &computeFullV=false)
Definition svd.hh:103
Definition active-set-differentiable-function.hh:36