Bien que la documentation de la fonction find_optimal_parameters
de dlib
bibliothèque était vraiment pas assez, il y a un test unitaire que vous pouvez trouver sur github qui montre comment utiliser la fonction.
J'ai vu l'autre question vous avez demandé et semble que la solution était quelque chose de différent que dans cette question. Cependant, voici un exemple, comment utiliser la bibliothèque (c'est la première fois que j'en entends parler) pour calculer ce dont vous avez besoin ou quelque chose de très proche. Probablement, vous devrez changer la fonction DistanceQuality() (en remplaçant la boucle existante par deux imbriqués) et je vous laisserai le faire vous-même.
Veuillez noter que tout ce qui se trouve dans le code est codé en dur, qu'aucune erreur de traitement n'est effectuée et que le test est effectué directement dans la fonction main() . Il y a beaucoup de travail à faire, même si vous pouvez trouver le code qui fonctionne à des fins d'illustration.
Here we go:
#include <iostream>
#include <dlib/optimization.h>
#include <dlib/optimization/find_optimal_parameters.h>
using namespace dlib;
typedef matrix<double, 3, 1> MyPoint;
std::vector<MyPoint> points;
std::vector<double> distances;
double MyDistance(MyPoint point1, MyPoint point2)
{
double sum = 0;
for (int i = 0; i < 3; i++)
{
sum += (point1(i, 0) - point2(i, 0)) * (point1(i, 0) - point2(i, 0));
}
return sqrt(sum);
}
double DistanceQuality(const matrix<double, 3, 3>& H)
{
double sum = 0;
for (int i = 0; i < points.size() - 1; i++)
{
auto proj1 = H*points[i];
auto proj2 = H*points[i+1];
sum += abs(MyDistance(proj1, proj2) - distances[i]);
}
return sum;
}
matrix<double, 3, 3> VecToMatrix(matrix<double, 0, 1> vec)
{
matrix<double, 3, 3> matrix;
for (int i = 0; i < 9; i++)
{
matrix(i/3, i % 3) = vec(i);
}
return matrix;
}
double test_function(matrix<double, 0, 1> H)
{
matrix<double, 3, 3> newH = VecToMatrix(H);
auto result = DistanceQuality(newH);
return result;
}
int main()
{
matrix<double, 3, 1> p1;
matrix<double, 3, 1> p2;
matrix<double, 3, 1> p3;
p1 = { 1, 1, 1 };
p2 = { 2, 2, 3 };
p3 = { 3, 1.6, 7};
points.push_back(p1);
points.push_back(p2);
points.push_back(p3);
double d1 = 2.44949;
double d2 = 4.142463;
distances.push_back(d1);
distances.push_back(d2);
matrix<double, 0, 1> H;
H = { 3, 1, 1,
1, 1, 6,
1, 4, 1 };
matrix<double, 0, 1> H_min;
matrix<double, 0, 1> H_max;
H_min = { 0.5, 0.6, 0.5,
0.5, 0.7, 0.5,
0.8, 0.3, 0.5, };
H_max = { 10, 10, 10,
10, 10, 10,
10, 10, 10, };
dlib::find_optimal_parameters(4, 0.001, 1000, H, H_min, H_max, test_function);
std::cout << "new H: " << std::endl << VecToMatrix(H) << std::endl;
return 0;
}
espère que vous pouvez adapter les paramètres pour vous cas précis.
La question est incomplète et peu claire. Premièrement, l'ajout de scalar (1) à vector n'est généralement pas défini. Deuxièmement, vous devez avoir quelque chose que vous optimisez en ce qui concerne. Qu'est-ce qui est donné? Et enfin, l'expression entière donnera un objet de type matriciel (si je le lis bien, c'est-à-dire que la matrice initiale H est multipliée par la somme) et je ne sais pas ce qu'est la minimisation matricielle. – n0p
Ce n'est pas scalaire (1) son point suivant (n + 1) tout est en indice. J'ai les points P (o) à P (m). J'ai la valeur initiale de Matrix H. – Deepak
Pour dlib, vous pouvez commencer à partir de cette page http://dlib.net/optimization.html – paiv