pinv.hh
Go to the documentation of this file.
1#pragma once
2
3#include <Eigen/Core>
4#include <Eigen/SVD>
5
6Eigen::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
13Eigen::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
Eigen::MatrixXd pseudoInverse(const Eigen::MatrixXd &a, double epsilon=std::numeric_limits< double >::epsilon())
Definition pinv.hh:6
Eigen::MatrixXd weightedPseudoInverse(const Eigen::MatrixXd &a, const Eigen::VectorXd w)
Definition pinv.hh:13