将函数 f(x,y) 作为 y 固定的参数传递
pass function f(x,y) as a parameter with y fixed
我想知道 c++ 中是否有任何方法可以传递给函数和其他函数,并修复其某些参数。
在这里解释一个例子:
#include<math.h>
#include<iostream>
double myfunc(double x) { return 5*x; }
double gaussian( double x , double s , double v) { return exp( (x-v)*(x-v) / (s*s) ) ; }
double Trapeze1D(const double x_min, const double x_max, double (*fonction)(double) )
{
double nb_pts = 100.0 ;
double integrale = 0.0 ;
double dx = ( x_max - x_min ) / (double) nb_pts ;
double x_k ;
while ( k < nb_pts-1 )
{
k++;
x_k = x_min + (double) k * dx ;
integrale += fonction(x_k) ;
}
integrale *= dx ;
return integrale ;
}
int main()
{
cout << Trapeze1D(0.0,1.0,myfunc) << endl ; // <-- works fine
cout << Trapeze1D(0.0,1.0, gaussian(double , 2,3) ) << endl ; // <-- I would like something like that ...
// Also tried :
double tmp(double x) = gaussian(x, 2,3) ; // <-- does not work C++ does not allow definition of function inside function ...
cout << Trapeze1D(0.0,1.0, tmp) << endl ;
}
我的问题如下,我将不得不集成(最终积分方法会复杂得多(几种不同类型的函数,其中许多取决于高斯、多项式、贝塔定律等参数......
我也尝试过使用这样的类:
class gaussian
{
public:
double eval(double x) ;
void get(double s, double v) ;
private:
double s ;
double v ;
}
double gaussian::eval(double x){ return exp( (x-v)*(x-v) / (s*s) ) ; }
int main()
{
gaussian G;
G.get(1.0,2.0) ;
cout << Trapeze1D(0.0,1.0,G.eval) << endl ; // <-- error
}
但我收到以下错误:必须调用对非静态成员函数的引用
任何帮助将不胜感激。非常感谢
有几种方法可以做到这一点。 最简单的是你实际上非常接近的一个:
int main()
{
std::cout << Trapeze1D(0.0, 1.0, myfunc) << std::endl;
auto tmp = [](double x){ return gaussian(x, 2, 3); };
std::cout << Trapeze1D(0.0, 1.0, tmp) << std::endl;
}
这将创建一个临时 lambda 函数来包装高斯函数。 如果您不熟悉 lambda,这是在文件顶部声明 tmp 的临时版本:
double myfunc(double x) { return 5*x; }
double gaussian( double x , double s , double v) { return exp( (x-v)*(x-v) / (s*s) ) ; }
double tmp(double x) { return gaussian(2, 3, x); }
如果您希望它更灵活,并且有兴趣定期更改s
和v
,您可以随时创建一个函子类,但这需要一些工作来更改Trapeze1D
函数以接收函数指针或函子:
template <typename FuncType>
double Trapeze1D(const double x_min, const double x_max, FuncType fonction)
{
...
integrale += fonction(x_k);
...
}
class gaussian_functor
{
public:
gaussian_functor(double s, double v)
: m_s(s)
, m_v(v)
{}
double operator() (double x) const { return exp((x - m_v)*(x - m_v) / (m_s*m_s)); }
private:
double m_s;
double m_v;
};
int main()
{
std::cout << Trapeze1D(0.0, 1.0, myfunc) << std::endl;
gaussian_functor my_functor(2.0, 3.0);
std::cout << Trapeze1D(0.0, 1.0, my_functor) << std::endl;
}
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用指向成员的指针将成员函数作为参数传递
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将部分流作为参数传递
- 我正在开发服务器,ip作为参数传递不起作用
- 将成员函数指针作为参数传递给模板方法
- 如何在 c++ 中将函数作为参数传递?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 使用引用与指针将数组作为参数传递
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 将__device__ lambda 作为参数传递给 __global__ 函数
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 如何将对象数组作为参数传递给模板
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 将函数作为参数传递以避免重复代码
- 将 lambda 函数作为参数传递C++
- GTEST : 如何将数组列表作为参数传递到 ValuesIn of INSTANTIATE_TEST_CASE_P?
- C++:如何做一个链表,结构作为参数传递?
- 如何将将参数包作为参数传递给其他模板类的模板类?