3#include <Eigen/Eigenvalues>
18 float sqrt2pi = std::sqrt(2 *
M_PI);
20 float norm = std::pow(sqrt2pi, -n) * std::pow(
covariance.determinant(), -0.5);
22 return norm * exp(-0.5 * quadform);
28 float probability =
pdf(
x);
39 Eigen::VectorXf sum(n);
41 for (
unsigned int i = 0; i < nr_iterations; i++)
44 x = 0.5 * (
x + Eigen::VectorXf::Ones(n));
47 sum = sum - (
static_cast<double>(nr_iterations) / 2) * Eigen::VectorXf::Ones(n);
48 x = sum / (std::sqrt(
static_cast<double>(nr_iterations) / 12));
51 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> eigen_solver(
covariance);
52 Eigen::MatrixXf eigenvectors = eigen_solver.eigenvectors().real();
55 Eigen::MatrixXf eigenvalues = eigen_solver.eigenvalues().real().asDiagonal();
58 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> es(eigenvalues);
59 Eigen::MatrixXf sqrt_eigenvalues = es.operatorSqrt();
60 Eigen::MatrixXf Q = eigenvectors * sqrt_eigenvalues;
68 Eigen::MatrixXf covariance =
69 Eigen::MatrixXf::Identity(
mean.size(),
mean.size()) * std::pow(
std, 2);
71 float sqrt2pi = std::sqrt(2 *
M_PI);
73 float norm = std::pow(sqrt2pi, -n) * std::pow(covariance.determinant(), -0.5);
75 float probability =
norm * exp(-0.5 * quadform);
76 return -probability * (
x -
mean) / covariance.determinant();
float pdf(const Eigen::VectorXf &x) const
Eigen::VectorXf pdf_gradient(const Eigen::VectorXf &x) const
Eigen::VectorXf sample(unsigned int nr_iterations=20) const
MultivariateNormal(const Eigen::VectorXf &mu, const Eigen::MatrixXf &cov)
Eigen::MatrixXf covariance
This file is part of ArmarX.
Eigen::VectorXf pdf_gradient(const Eigen::VectorXf &mean, float std, const Eigen::VectorXf &x)
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::optional< float > mean(const boost::circular_buffer< NameValueMap > &buffer, const std::string &key)
std::vector< std::vector< T > > transpose(const std::vector< std::vector< T > > &src, Thrower thrower)
double norm(const Point &a)