Test Tukey M-Estimator.
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(
static_cast<unsigned int>(time(
nullptr)));
vpColVector residues_col(
static_cast<unsigned int>(nb_elements));
for (size_t i = 0; i < nb_elements; i++) {
residues_col[static_cast<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[static_cast<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[
static_cast<unsigned int>(i)], noise_threshold)) {
std::cerr << "Difference between vpRobust::TUKEY and vpMbtTukeyEstimator (double)!" << std::endl;
std::cerr << "weights_col[" << i << "]=" << weights_col[static_cast<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[static_cast<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] = static_cast<float>(residues_col[static_cast<unsigned int>(i)]);
weights[i] = static_cast<float>(weights_col_save[static_cast<unsigned int>(i)]);
}
for (int i = 0; i < nb_iterations; i++) {
tukey_estimator.MEstimator(residues, weights, static_cast<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],
static_cast<float>(weights_col[
static_cast<unsigned int>(i)]),
static_cast<float>(noise_threshold))) {
std::cerr << "Difference between vpRobust::TUKEY and vpMbtTukeyEstimator (float)!" << std::endl;
std::cerr << "weights_col[" << i << "]=" << weights_col[static_cast<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[static_cast<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[
static_cast<unsigned int>(i)], weights_col[
static_cast<unsigned int>(i)], noise_threshold)) {
std::cerr << "Difference between vpRobust::TUKEY and vpMbtTukeyEstimator (float)!" << std::endl;
std::cerr << "weights_col[" << i << "]=" << weights_col[static_cast<unsigned int>(i)] << std::endl;
std::cerr << "weights[" << i << "]=" << weights[static_cast<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.
void seed(uint64_t seed_val)
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()