pinv.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <Eigen/Core>
4 #include <Eigen/SVD>
5 
6 Eigen::MatrixXd pseudoInverse(const Eigen::MatrixXd& a, double epsilon = std::numeric_limits<double>::epsilon())
7 {
8  Eigen::JacobiSVD< Eigen::MatrixXd > svd(a, Eigen::ComputeThinU | Eigen::ComputeThinV);
9  double tolerance = epsilon * std::max(a.cols(), a.rows()) * svd.singularValues().array().abs()(0);
10  return svd.matrixV() * (svd.singularValues().array().abs() > tolerance).select(svd.singularValues().array().inverse(), 0).matrix().asDiagonal() * svd.matrixU().adjoint();
11 }
12 
13 Eigen::MatrixXd weightedPseudoInverse(const Eigen::MatrixXd& a, const Eigen::VectorXd w)
14 {
15 
16  int lenght = w.size();
17 
18  Eigen::DiagonalMatrix<double, Eigen::Dynamic> Winv(lenght);
19  Winv = w.asDiagonal().inverse(); // diag(1./w)
20 
21  Eigen::MatrixXd tmp(lenght, lenght);
22 
23  //(a*Winv*a.transpose())
24  tmp = pseudoInverse(a * Winv * a.transpose(), 10E-10);
25 
26  return Winv * a.transpose() * tmp;
27 
28 }
29 
weightedPseudoInverse
Eigen::MatrixXd weightedPseudoInverse(const Eigen::MatrixXd &a, const Eigen::VectorXd w)
Definition: pinv.hh:13
armarx::ctrlutil::a
double a(double t, double a0, double j)
Definition: CtrlUtil.h:45
max
T max(T t1, T t2)
Definition: gdiam.h:48
pseudoInverse
Eigen::MatrixXd pseudoInverse(const Eigen::MatrixXd &a, double epsilon=std::numeric_limits< double >::epsilon())
Definition: pinv.hh:6