将2D功能转换为1D功能

时间:2015-04-14 14:32:39

标签: c++11 math lambda linear-algebra std-function

用于教育目的

我有一个函数,它接受给定输入函数的导数。

//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-我知道使用图书馆会更容易,但我想自己学会这样做,因此在顶层教育。 - 谢谢你

2 个答案:

答案 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案件我作为练习留给提问者。