为了解决计算机视觉问题,我必须最小化非线性能量函数,并用C ++实现。尽管我没有找到可以帮助我实现特定功能的库,但我已经掌握了数学方法。那么,从符号数学到C ++代码的最佳方法是什么?

示例:给定函数g(x):= x ^ 2和f(x):= x + 2,让我们想象一下我有兴趣将f(g(x))转换为C代码;明显的C代码是y = x ^ 2 + 2;但是,对于复杂的数学运算(包括雅可比运算符等)来说,转换为页面和操作页面并不容易。

我已经尝试过Matlab及其将模块转换为C代码的方法,但是代码远未优化(例如:同一操作重复多次而不是重复使用结果)。

最佳答案

可以从C ++,C,Matlab,Fortran(...)调用NLopt库进行非线性优化。使用此库的最小化过程的实现可能如下所示:

#include <nlopt.hpp>

nlopt::opt opt(nlopt::LD_MMA, 2);

std::vector<double> lb(2);
lb[0] = -HUGE_VAL; lb[1] = 0;
opt.set_lower_bounds(lb);

opt.set_min_objective(myfunc, NULL);

my_constraint_data data[2] = { {2,0}, {-1,1} };
opt.add_inequality_constraint(myconstraint, &data[0], 1e-8);
opt.add_inequality_constraint(myconstraint, &data[1], 1e-8);

opt.set_xtol_rel(1e-4);

std::vector<double> x(2);
x[0] = 1.234; x[1] = 5.678;
double minf;
nlopt::result result = opt.optimize(x, minf);

07-27 19:41