MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ fit_ellipsoid()

EllipsoidExtent MayaFlux::Kinesis::fit_ellipsoid ( std::span< const Eigen::VectorXd >  samples,
double  radius_sigma = 2.0,
double  softness = 0.5 
)
inline

Fit an ellipsoid extent from the mean and spread of a sample set.

Parameters
samplesObservations, all of the same dimension
radius_sigmaPer-axis radius as a multiple of that axis's standard deviation
softnessAdditional normalized distance over which membership falls to zero beyond the fitted radius
Returns
Centre at the sample mean, radii at radius_sigma standard deviations

The prototype form of a demonstrated meaning: the centre is what was done on average and the radii are how much it varied, so an axis held consistently across demonstrations constrains membership tightly while one that wandered constrains it loosely.

Definition at line 337 of file FeatureExtent.hpp.

341{
342 if (samples.empty())
343 return {};
344
345 const Eigen::Index n = samples.front().size();
346 Eigen::VectorXd mean = Eigen::VectorXd::Zero(n);
347 for (const auto& s : samples)
348 mean += s;
349 mean /= static_cast<double>(samples.size());
350
351 Eigen::VectorXd var = Eigen::VectorXd::Zero(n);
352 for (const auto& s : samples) {
353 const Eigen::VectorXd d = s - mean;
354 var += d.cwiseProduct(d);
355 }
356 var /= static_cast<double>(samples.size());
357
358 Eigen::VectorXd radii(n);
359 for (Eigen::Index i = 0; i < n; ++i)
360 radii(i) = std::max(radius_sigma * std::sqrt(var(i)), 1e-9);
361
362 return { .centre = mean, .radii = radii, .softness = softness };
363}
double mean(const std::vector< double > &data)
Calculate mean of single-channel data.
Definition Yantra.cpp:55

References MayaFlux::mean().

+ Here is the call graph for this function: