【发布时间】:2019-01-21 06:12:57
【问题描述】:
我很擅长 Python,但我对 C++ 和指针之类的东西还是很陌生。我尝试编写一些代码来使用线性代数的 Eigen 包求解 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;
}
我有以下问题:
函数参数中
&的含义是什么?通过引用传递?我刚刚从official documentation 复制了代码,但我不太确定我是否理解RK4 的函数参数中的每一位,例如VectorXd Func(const VectorXd& y)。是否有其他方法可以接受 Eigen::MatrixXd 和接受 Eigen::MatrixXd 作为函数参数的函数?据我了解,我们无法从函数返回整个二维数组,而我们返回的只是数组的第一个元素(如果我错了,请纠正我)。
Eigen::MatrixX呢?我们实际上传递/返回的是什么?矩阵的第一个元素,还是 Eigen 库定义的全新对象?我不确定这些代码是否有效。我能做些什么来优化这部分吗? (只是想知道我是否做了任何可能显着降低速度的事情)。
谢谢
【问题讨论】:
-
a) 每个问题一个问题 b) 看看here
-
关于您的第一个问题:是的,您是对的。一个声明为
ReturnType FunctionName(ArgType& arg);的函数引用一个名为arg的ArgType类型变量。注意:因为(特别)对于通过引用而不是复制它们传递参数的较大对象会导致更好的性能,许多函数使用const引用作为它们的参数。见:stackoverflow.com/questions/3694630/… -
关于性能,尽可能对微小对象(比如 Vector2d。
标签: c++ function pointers function-pointers eigen