向量值函数作为 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 和编译器完成。我不希望看到更大的矩阵大小在性能上有任何重大差异。
我正在为表单的特定 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 和编译器完成。我不希望看到更大的矩阵大小在性能上有任何重大差异。