首页 > 解决方案 > 在与 Odeint 结合的类中使用 Eigen Matrix Ref

问题描述

我想使用 odeint 自适应地求解复杂特征矩阵的一组耦合微分方程,第一个想法是只使用矩阵向量(由于误差估计器中的假设而不起作用)。现在我尝试通过使用大矩阵并为矩阵块创建 Eigen::Refs 来构建解决方法,但这不起作用,因为 Refs 没有默认构造函数。同样在处理参考文献时,它们或矩阵之间有什么区别吗?这是因为我稍后必须重新排列矩阵的组件。

最小代码示例:在 .h 中:

class example{
public:
    example(int&);
    Eigen::Ref<Eigen::MatrixXcd> vertex_P_zero;
    Eigen::Ref<Eigen::MatrixXcd> vertex_D_zero;
    Eigen::Ref<Eigen::MatrixXcd> vertex_X_zero;
private: 
    Eigen::MatrixXcd Vertex_channels;

在.cpp中:

example::example(int &_mat_size){
    Vertex_channels = Eigen::MatrixXcd::Zero(3*_mat_size, _mat_size);
    vertex_P_zero = (Vertex_channels.block(0,0,_mat_size*bond_num, _mat_size*bond_num));
    vertex_X_zero = (Vertex_channels.block(_mat_size*bond_num, 0,_mat_size*bond_num,  _mat_size*bond_num));
    vertex_D_zero = (Vertex_channels.block(2*_mat_size*bond_num, 0,_mat_size*bond_num, _mat_size*bond_num));
}

我是否理解正确,当将 refs 传递给函数时,我将它们作为 Ref 传递并且可以像矩阵一样访问它们的元素?

谢谢^^

标签: c++matrixreferenceeigenodeint

解决方案


对于初始化,您可以编写:

example::example(int _mat_size)
    : Vertex_channels(3*_mat_size*bond_num,3*_mat_size),
      vertex_P_zero(Vertex_channels.block(0,0,_mat_size*bond_num, _mat_size*bond_num)),
      vertex_X_zero(Vertex_channels.block(_mat_size*bond_num, 0,_mat_size*bond_num,  _mat_size*bond_num)),
      vertex_D_zero(Vertex_channels.block(2*_mat_size*bond_num, 0,_mat_size*bond_num, _mat_size*bond_num))
{
    Vertex_channels.setZero();
}

然后,您确实可以vertex_X_zero像 a 一样读/写和其他人MatrixXcd,并且修改的条目vertex_X_zero将修改Vertex_channels,反之亦然。当然,如果您传递vertex_P_zero给期望 a 的函数MatrixXcd,则会发生副本。您的函数必须是模板化的,或者编写为采用Ref<MatrixXcd>.


推荐阅读