> > > >代码>是传递引用的函数,后者是传递函数的语法,它引用向量并返回向量。特征::矩阵< /代码>应该始终通过引用。有很多方法将一个函数传递给另一个函数,C++中最惯用的可能是模板参数和代码。>std::函数,c++,function,pointers,function-pointers,eigen,C++,Function,Pointers,Function Pointers,Eigen" /> > > > >代码>是传递引用的函数,后者是传递函数的语法,它引用向量并返回向量。特征::矩阵< /代码>应该始终通过引用。有很多方法将一个函数传递给另一个函数,C++中最惯用的可能是模板参数和代码。>std::函数,c++,function,pointers,function-pointers,eigen,C++,Function,Pointers,Function Pointers,Eigen" />

本征函数指针 我对Python相当胜任,但对于C++和指针之类的东西,我是很新的。我试着用线性代数的特征包写一些代码来求解ODE(我以后需要处理很多矩阵,所以我计划从它开始)。我有以下RK4代码,它们可以工作: #include "../eigen-eigen-b3f3d4950030/Eigen/Dense" using namespace Eigen; VectorXd Func(const VectorXd& a) { // equations for solving simple harmonic oscillator Vector2d ans; ans(0) = a(1); // dy/dt ans(1) = -a(0); // d2y/dt2 return ans; } MatrixXd RK4(VectorXd Func(const VectorXd& y), const Ref<const VectorXd>& y0, double h, int step_num) { MatrixXd y(step_num, y0.rows()); y.row(0) = y0; for (int i=1; i<step_num; i++){ VectorXd y_old = y.row(i-1).transpose(); VectorXd k1 = h*Func(y_old); VectorXd k2 = h*Func(y_old+k1/2); VectorXd k3 = h*Func(y_old+k2/2); VectorXd k4 = h*Func(y_old+k3); VectorXd dy = (k1 + 2*k2 + 2*k3 + k4)/6; y.row(i) = y.row(i-1) + dy.transpose(); } return y; } int main() { Vector2d v1; v1(0) = 1.4; v1(1) = -0.1; double h = 0.1; int step_num = 50; MatrixXd sol = RK4(Func,v1,h,step_num); return 0; } #包括“./eigen-eigen-b3f3d4950030/eigen/densed” 使用名称空间特征; 矢量xd函数(常量矢量xd&a) {//求解简谐振子的方程 向量; ans(0)=a(1);//dy/dt ans(1)=-a(0);//d2y/dt2 返回ans; } 矩阵XXD RK4(向量xd Func(常量向量xd&y),常量Ref&y0,双h,整数步长) { 矩阵y(步骤数,y0.rows()); y、 行(0)=y0; 对于(int i=1;i < > > > > >代码>是传递引用的函数,后者是传递函数的语法,它引用向量并返回向量。特征::矩阵< /代码>应该始终通过引用。有很多方法将一个函数传递给另一个函数,C++中最惯用的可能是模板参数和代码。>std::函数

本征函数指针 我对Python相当胜任,但对于C++和指针之类的东西,我是很新的。我试着用线性代数的特征包写一些代码来求解ODE(我以后需要处理很多矩阵,所以我计划从它开始)。我有以下RK4代码,它们可以工作: #include "../eigen-eigen-b3f3d4950030/Eigen/Dense" using namespace Eigen; VectorXd Func(const VectorXd& a) { // equations for solving simple harmonic oscillator Vector2d ans; ans(0) = a(1); // dy/dt ans(1) = -a(0); // d2y/dt2 return ans; } MatrixXd RK4(VectorXd Func(const VectorXd& y), const Ref<const VectorXd>& y0, double h, int step_num) { MatrixXd y(step_num, y0.rows()); y.row(0) = y0; for (int i=1; i<step_num; i++){ VectorXd y_old = y.row(i-1).transpose(); VectorXd k1 = h*Func(y_old); VectorXd k2 = h*Func(y_old+k1/2); VectorXd k3 = h*Func(y_old+k2/2); VectorXd k4 = h*Func(y_old+k3); VectorXd dy = (k1 + 2*k2 + 2*k3 + k4)/6; y.row(i) = y.row(i-1) + dy.transpose(); } return y; } int main() { Vector2d v1; v1(0) = 1.4; v1(1) = -0.1; double h = 0.1; int step_num = 50; MatrixXd sol = RK4(Func,v1,h,step_num); return 0; } #包括“./eigen-eigen-b3f3d4950030/eigen/densed” 使用名称空间特征; 矢量xd函数(常量矢量xd&a) {//求解简谐振子的方程 向量; ans(0)=a(1);//dy/dt ans(1)=-a(0);//d2y/dt2 返回ans; } 矩阵XXD RK4(向量xd Func(常量向量xd&y),常量Ref&y0,双h,整数步长) { 矩阵y(步骤数,y0.rows()); y、 行(0)=y0; 对于(int i=1;i < > > > > >代码>是传递引用的函数,后者是传递函数的语法,它引用向量并返回向量。特征::矩阵< /代码>应该始终通过引用。有很多方法将一个函数传递给另一个函数,C++中最惯用的可能是模板参数和代码。>std::函数,c++,function,pointers,function-pointers,eigen,C++,Function,Pointers,Function Pointers,Eigen,不能有多个返回参数,但可以返回对或元组或矩阵对象。RK4返回整个矩阵 代码是相当有效的。如果它真的是性能关键的,可能有一些事情可以优化,但我现在不会担心 最大的一点是,RK4非常通用,可用于动态大小的类型,这比其静态大小的计数器部件(VectorXfvsVector2d)要昂贵得多。但这将要求您为所有感兴趣的维度创建一个专门的版本,或者让编译器使用模板为您执行此操作 一般来说:读一本好书来开始。a)请每个问题问一个问题b)看看第一个问题:是的,你是对的。声明为ReturnType Funct

不能有多个返回参数,但可以返回
元组
矩阵
对象。
RK4
返回整个矩阵

  • 代码是相当有效的。如果它真的是性能关键的,可能有一些事情可以优化,但我现在不会担心

    最大的一点是,
    RK4
    非常通用,可用于动态大小的类型,这比其静态大小的计数器部件(VectorXfvs
    Vector2d
    )要昂贵得多。但这将要求您为所有感兴趣的维度创建一个专门的版本,或者让编译器使用模板为您执行此操作


  • 一般来说:读一本好书来开始。

    a)请每个问题问一个问题b)看看第一个问题:是的,你是对的。声明为
    ReturnType FunctionName(ArgType&arg)的函数;
    引用了
    ArgType
    类型的变量,称为
    arg
    。注意:因为(特别)对于较大的对象,通过引用传递参数而不是复制参数可以获得更好的性能。许多函数对其参数使用
    const
    引用。请参阅:关于性能,对于较小的对象,尽可能使用编译时向量/矩阵类型(例如