向量值函数作为 c++ class 定义中的参数与 Eigen

Vector valued function as argument in c++ class definition with Eigen

我正在为表单的特定 ODE 编写数值方法 y'(t) = A*y(t) + g(t,y) 在 C++ 中,其中 A 是矩阵,g 是向量函数,即以时间和向量作为输入的函数,return 是向量。我正在使用库 Eigen.

我正在编写自己的 class,但我无法理解如何将向量函数 g(t,y) 作为 class 定义中的参数传递,即

integrator(double fin_time, int time_steps, MatrixXd rhs, VectorXd g, VectorXd in_data)

如何使用 Eigen 做到这一点?

当函数是标量的时候,我一般都是double (*f)(double t, double y),当然这里不一样

我更喜欢使用适当的 C++11 函数对象,而不是使用函数指针。函数 g(t, y) 将具有以下类型;

std::function<VectorXd (double, const VectorXd&)> g;

此类型可用于您的 class 构造函数。

如您所述,向量的典型大小为 n=8000。对于该大小,您可以使用动态或固定大小的特征向量。如果您使用动态向量,则应避免动态调整大小。这可以通过在定义变量时分配正确的大小来实现:

VectorXd vec(n);

既然你在编译时就知道大小 n,你也可以使用模板参数来固定大小:

template<int n>
class SpecialODE {
     using Vector = Eigen::Matrix<double, n, 1>
};

在这两种情况下,循环展开和 SIMD 向量化均由 Eigen 和编译器完成。我不希望看到更大的矩阵大小在性能上有任何重大差异。