用于教育目的
我有一个函数,它接受给定输入函数的导数。
//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值固定在我们想要取梯度的点上。
所以我的问题是如何将一个带有2个变量的std :: function转换为一个采用单个变量的函数。
PS-我知道使用图书馆会更容易,但我想自己学会这样做,因此在顶层教育。 - 谢谢你
答案 0 :(得分:4)
您应该使用std::bind
来绑定固定参数。这将生成一个部分应用的函数,您可以将剩余的参数传递给。
你的例子应该看起来像:
std::function<double(double)> fnX = std::bind(fn, std::placeholders::_1, y);
答案 1 :(得分:3)
Lambda救援:
std::function<double(double)> fnX =
[fn,y](double xVar){
return fn( xVar, y);
};
这将生成一个匿名可调用对象,该对象占用一个double
并返回一个double
。 (返回类型是从fn
)
lambda的语法是[
capture-list ](
argument-list )
可选->
然后返回类型{
代码}
。它创建了一个unnamable类型的对象,当使用argument-list调用时,它运行代码并返回返回的代码。它们非常有用。
概念性问题是xVar
不在该行上命名任何内容。 std::function<double(double xVar)>
xVar
被丢弃,并不代表文档以外的任何内容。
因此,同一行上的后一个xVar
与任何含义无关。使用上面的lambda,我们将xVar
绑定到函数对象的参数,然后可以将其转换为std::function<double(double)>
。
yVar
案件我作为练习留给提问者。