Test Tukey M-Estimator.
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpGaussRand.h>
#include <visp3/core/vpRobust.h>
#include <visp3/mbt/vpMbtTukeyEstimator.h>
int main()
{
#ifdef ENABLE_VISP_NAMESPACE
#endif
size_t nb_elements = 1000;
int nb_iterations = 100;
double stdev = 0.5, mean = 0.0, noise_threshold = 1e-3;
noise.
seed((
unsigned int)time(
nullptr));
for (size_t i = 0; i < nb_elements; i++) {
residues_col[(unsigned int)i] = noise();
}
for (int i = 0; i < nb_iterations; i++) {
}
{
vpMbtTukeyEstimator<double> tukey_estimator;
std::vector<double> residues(nb_elements);
for (size_t i = 0; i < residues.size(); i++) {
residues[i] = residues_col[(unsigned int)i];
}
std::vector<double> weights;
for (int i = 0; i < nb_iterations; i++) {
tukey_estimator.MEstimator(residues, weights, noise_threshold);
}
std::cout << "t_robust=" << t_robust << " ms ; t (double)=" << t << " ; ratio=" << (t_robust / t) << std::endl;
for (size_t i = 0; i < weights.size(); i++) {
if (!
vpMath::equal(weights[i], weights_col[(
unsigned int)i], noise_threshold)) {
std::cerr << "Difference between vpRobust::TUKEY and "
"vpMbtTukeyEstimator (double)!"
<< std::endl;
std::cerr << "weights_col[" << i << "]=" << weights_col[(unsigned int)i] << std::endl;
std::cerr << "weights[" << i << "]=" << weights[i] << std::endl;
return EXIT_FAILURE;
}
}
}
for (size_t i = 0; i < nb_elements; i++) {
residues_col[(unsigned int)i] = noise();
}
weights_col_save = weights_col;
for (int i = 0; i < nb_iterations; i++) {
}
{
vpMbtTukeyEstimator<float> tukey_estimator;
std::vector<float> residues(nb_elements);
std::vector<float> weights(nb_elements);
for (size_t i = 0; i < residues.size(); i++) {
residues[i] = (float)residues_col[(unsigned int)i];
weights[i] = (float)weights_col_save[(unsigned int)i];
}
for (int i = 0; i < nb_iterations; i++) {
tukey_estimator.MEstimator(residues, weights, (float)noise_threshold);
}
std::cout << "t_robust=" << t_robust << " ms ; t (float)=" << t << " ; ratio=" << (t_robust / t) << std::endl;
for (size_t i = 0; i < weights.size(); i++) {
if (!
vpMath::equal(weights[i], weights_col[(
unsigned int)i], noise_threshold)) {
std::cerr << "Difference between vpRobust::TUKEY and "
"vpMbtTukeyEstimator (float)!"
<< std::endl;
std::cerr << "weights_col[" << i << "]=" << weights_col[(unsigned int)i] << std::endl;
std::cerr << "weights[" << i << "]=" << weights[i] << std::endl;
return EXIT_FAILURE;
}
}
}
for (size_t i = 0; i < nb_elements; i++) {
residues_col[(unsigned int)i] = noise();
}
weights_col_save = weights_col;
for (int i = 0; i < nb_iterations; i++) {
}
{
vpMbtTukeyEstimator<double> tukey_estimator;
for (int i = 0; i < nb_iterations; i++) {
tukey_estimator.MEstimator(residues, weights, noise_threshold);
}
std::cout << "t_robust=" << t_robust << " ms ; t (vpColVector)=" << t << " ; ratio=" << (t_robust / t) << std::endl;
for (
size_t i = 0; i < weights.
size(); i++) {
if (!
vpMath::equal(weights[(
unsigned int)i], weights_col[(
unsigned int)i], noise_threshold)) {
std::cerr << "Difference between vpRobust::TUKEY and "
"vpMbtTukeyEstimator (float)!"
<< std::endl;
std::cerr << "weights_col[" << i << "]=" << weights_col[(unsigned int)i] << std::endl;
std::cerr << "weights[" << i << "]=" << weights[(unsigned int)i] << std::endl;
return EXIT_FAILURE;
}
}
}
std::cout << "vpMbtTukeyEstimator returns the same values than vpRobust::TUKEY." << std::endl;
return EXIT_SUCCESS;
}
unsigned int size() const
Return the number of elements of the 2D array.
Implementation of column vector and the associated operations.
Class for generating random number with normal probability density.
static bool equal(double x, double y, double threshold=0.001)
Contains an M-estimator and various influence function.
@ TUKEY
Tukey influence function.
void MEstimator(const vpRobustEstimatorType method, const vpColVector &residues, vpColVector &weights)
void setMinMedianAbsoluteDeviation(double mad_min)
VISP_EXPORT double measureTimeMs()