1

我已经从

http://matt.eifelle.com/2012/07/17/just-a-small-example-of-numerical-optimization-in-c/

并尝试在不知道以下源的 auto 的 g++ 4.4.6 中编译:

  auto optimizer = Optimization::Local::build_simplex( 
  fun,
  Optimization::Local::make_and_criteria(Optimization::Local::IterationCriterion(max_iterations),
      Optimization::Local::RelativeValueCriterion<float>(ftol))); 

阅读网页,我知道这是因为 C++11 支持 auto,所以我尝试搜索我下载的源代码,有一个 simplex.h,它具有以下源代码:

template<class Function, class Criterion>
static Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> build_simplex(const Function& fun, const Criterion& criterion)
{
  return Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion>(criterion);
}

然后我改变

auto optimizer  

Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer

或者

Optimization::Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer

没有人会通过编译器!

我不太了解 c++ 的模板用法,除了获得 c++11 编译,我应该为这个 auto 做什么返回的数据类型修改?

更新 :

感谢您的帮助,我修改int optimizer并编译,我得到 test_rosenbrock_simplex.cpp:44: error: cannot convert Optimization::Local::Simplex<float, Eigen::Matrix<float, 2, 1, 0, 2, 1>, Rosenbrock, Optimization::Local::AndCriteria<Optimization::Local::IterationCriterion, Optimization::Local::RelativeValueCriterion<float> > >int初始化

然后我将代码更改为:

Optimization::Local::Simplex<float, Eigen::Matrix<float, 2, 1, 0, 2, 1>, Rosenbrock, Optimization::Local::AndCriteria<Optimization::Local::IterationCriterion, Optimization::Local::RelativeValueCriterion<float> > > optimizer

有用 !!!!!

g++ -O2 -march=native -msse2 -m64 -DEIGEN_NO_DEBUG test_rosenbrock_simplex.cpp -I/home/usrA/tools/eigen-eigen-5097c01bcdc4 -o test_rosenbrock_simplex.exe

./test_rosenbrock_simplex.exe

-2.75  -0.5     0
2.1875 1.125     0
Starting point: 10
10
Starting value: 8181
Best point: 1
1
Best value: 5.68434e-14
4

3 回答 3

7

您必须替换实际的模板参数,只是声明的返回类型不会削减它。

正如 Drew 在评论中提到的,您可以说服编译器告诉您这一点。

简单地写

int optimizer = .....;

并检查产生的错误。

于 2013-04-15T02:46:00.613 回答
1

Boost 有一个实现 c++11 自动相似的宏。它被称为BOOST_AUTO

它看起来像:

BOOST_AUTO(optimizer, Optimization::Local::build_simplex(
    fun,
    Optimization::Local::make_and_criteria(Optimization::Local::IterationCriterion(max_iterations),
    Optimization::Local::RelativeValueCriterion<float>(ftol))); 
于 2013-04-15T02:48:29.913 回答
0

实际上,要么使用 Boost 宏,要么自己编写完整类型。很抱歉我没有把所有的东西都放好,但我只会用 C++11 编译器来编码。否则,坚持使用非模板代码。(我是博客作者)。

于 2014-02-03T20:34:21.903 回答