将二维函数转换为一维函数
Convert 2D function to 1D 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)
我想将导数扩展到更高的维度。 ie.Take 一个花园。
// 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 值将二维函数变成一维函数。
x 或 y 值固定在我们要采用梯度的点。
所以我的问题是如何将带 2 个变量的 std::function 转换为带单个变量的函数。
PS- 我知道使用图书馆会更容易,但我想自己学习,因此教育最重要。
- 谢谢
Lambda 来拯救:
std::function<double(double)> fnX =
[fn,y](double xVar){
return fn( xVar, y);
};
这会生成一个匿名可调用对象,它需要一个 double
和 return 一个 double
。 (return类型是从fn
的return类型推导出来的)
lambda 的语法是 [
捕获列表 ](
参数列表 )
可选 ->
然后 return 输入 {
代码}
。它创建一个不可命名类型的对象,当使用参数列表调用时,运行代码和 returns 无论代码 returned。它们非常有用。
概念上的问题是 xVar
没有 在该行命名任何内容。 std::function<double(double xVar)>
那里的 xVar
已被丢弃,并且 "mean" 除了文档之外没有任何其他内容。
所以同一行后面的xVar
也就没有任何意义了。使用上面的 lambda,我们将 xVar
绑定到函数对象的参数,然后可以将其转换为 std::function<double(double)>
.
yVar
案例我留给提问者作为练习。
您应该使用std::bind
绑定固定参数。这将产生一个部分应用的函数,您可以将剩余的参数传递给它。
您的示例应该类似于:
std::function<double(double)> fnX = std::bind(fn, std::placeholders::_1, y);
用于教育目的
我有一个函数,它取给定输入函数的导数。
//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)
我想将导数扩展到更高的维度。 ie.Take 一个花园。
// 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 值将二维函数变成一维函数。 x 或 y 值固定在我们要采用梯度的点。
所以我的问题是如何将带 2 个变量的 std::function 转换为带单个变量的函数。
PS- 我知道使用图书馆会更容易,但我想自己学习,因此教育最重要。 - 谢谢
Lambda 来拯救:
std::function<double(double)> fnX =
[fn,y](double xVar){
return fn( xVar, y);
};
这会生成一个匿名可调用对象,它需要一个 double
和 return 一个 double
。 (return类型是从fn
的return类型推导出来的)
lambda 的语法是 [
捕获列表 ](
参数列表 )
可选 ->
然后 return 输入 {
代码}
。它创建一个不可命名类型的对象,当使用参数列表调用时,运行代码和 returns 无论代码 returned。它们非常有用。
概念上的问题是 xVar
没有 在该行命名任何内容。 std::function<double(double xVar)>
那里的 xVar
已被丢弃,并且 "mean" 除了文档之外没有任何其他内容。
所以同一行后面的xVar
也就没有任何意义了。使用上面的 lambda,我们将 xVar
绑定到函数对象的参数,然后可以将其转换为 std::function<double(double)>
.
yVar
案例我留给提问者作为练习。
您应该使用std::bind
绑定固定参数。这将产生一个部分应用的函数,您可以将剩余的参数传递给它。
您的示例应该类似于:
std::function<double(double)> fnX = std::bind(fn, std::placeholders::_1, y);