用于教育目的
我有一个函数,它采用给定输入函数的导数。
//In analysis class
double analysis::differentiateBest(std::function<double(double)> fn, double x)
{
return derivative_1_Richardson_6O(fn, x);
}
我调用这个函数的方式是使用 lambda 代替 std::function
analysis al;
std::cout << al.differentiateBest([](double x) { return x*x*x*x*x*x; }, 2)
我想将导数扩展到更高维度。拿一个加尔德。
// matrix<T> my class for holding matrices , implemented as 1D std::vector
matrix<double> analysis::gradient_2D(std::function<double(double, double)> fn,double x, double y)
{
matrix<double> R(2, 1);
//DOUBT
std::function<double(double xVar)> fnX = fn( xVar, y); //ERROR
// creates a new fn which holds y constant and allows x to vary
std::function<double(double yVar)> fnY = fn( x, yVar); //ERROR
// creates a new fn which holds x constant and allows y to vary
R(1, 1) = differentiateBest(fnX,x); // Takes derivative in X direction , holding y constant
R(1, 2) = differentiateBest(fnY,y); // Takes derivative in Y direction , holding x constant
return R;
}
所以我称之为梯度的方式是
analysis al;
matrix<double> R = al.gradient_2D([](double x,double y) { return x*x*x*y + y; }, 2 ,3) ;
// Takes the gradient of lambda function at the point 2 , 3
这就是我想做的。但是我在这条线上的VS中出现错误
std::function<double(double xVar)> fnX = fn( xVar, y);
std::function<double(double yVar)> fnY = fn( x, yVar);
我想通过固定 x 或 y 值将 2D 函数变成 1D 函数。x 或 y 值固定在我们想要取梯度的点上。
所以我的问题是如何将一个 std::函数转换为一个带一个变量的函数。
PS-我知道使用图书馆会更容易,但我想自己学习这样做,因此具有教育意义。-谢谢
你应该使用 std::bind
来绑定固定参数。 这将生成一个部分应用的函数,您可以将剩余的参数传递到其中。
您的示例可能如下所示:
std::function<double(double)> fnX = std::bind(fn, std::placeholders::_1, y);
Lambda 来救援:
std::function<double(double)> fnX =
[fn,y](double xVar){
return fn( xVar, y);
};
这将生成一个匿名可调用对象,该对象接受一个double
并返回一个double
。 (返回类型是从返回类型fn
推导出来的)
lambda 的语法是[
捕获列表](
参数列表)
可选->
然后返回类型{
代码}
。 它创建一个不可命名类型的对象,当使用参数列表调用该对象时,该对象将运行代码并返回代码返回的任何内容。 它们非常有用。
概念上的问题是xVar
没有在该行上命名任何内容。 std::function<double(double xVar)>
xVar
被丢弃,并且除了文档之外,不"意味着"任何其他内容。
因此,同一行上的后xVar
因此与任何意义无关。 使用上面的lambda,我们将xVar
绑定到函数对象的参数,然后将其转换为std::function<double(double)>
。
yVar
案例我留给提问者作为练习。