ライブラリのfind_optimal_parameters
機能のドキュメントは実際には十分ではありませんでしたが、この機能を使用する方法を示すgithubにある単体テストがあります。
私はあなたが尋ねた他のquestionを見ましたが、解決策はこの質問とは異なるものだったようです。しかし、ここでは、あなたが必要とするもの、またはそれに非常に近いものを計算するために、ライブラリをどのように使用するかの例があります(これについて私が聞いているのは初めてです)。おそらくDistanceQuality()関数を変更する必要があります(既存のループを2つのネストされたループに置き換えることにより)。
コード全体がハードコードされているため、エラー処理は行われず、main()関数でテストが正しく行われることに注意してください。実行する作業はたくさんありますが、コードがイラストレーションの目的で動作していることがわかります。
ここに私達は行く:
#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;
}
はあなたの特定のケースのためのパラメータを適応させることができます願っています。
質問は不完全で不明です。まず、vectorにscalar(1)を追加することは一般的には定義されていません。第二に、あなたはあなたが最適化するものを持っていなければなりません。与えられたものは何ですか?最後に、式全体が行列型のオブジェクトを与えます(もし私がそれを正しく読んでいれば、それは最初の行列Hに合計が掛けられます)。そして、行列の最小化がわかりません。 – n0p
スカラーではない(1)その次の点(n + 1)は全て下付き文字である。私はP(o)からP(m)までの点を持っています。私は行列Hの初期値を持っています。 – Deepak
dlibの場合は、このページから始めることができます。http://dlib.net/optimization.html – paiv