C++ 在与Odeint结合的类中使用特征矩阵Ref

C++ 在与Odeint结合的类中使用特征矩阵Ref,c++,matrix,reference,eigen,odeint,C++,Matrix,Reference,Eigen,Odeint,我想使用odeint自适应地解一组复杂特征矩阵的耦合微分方程,第一个想法是只使用矩阵向量(由于误差估计中的假设而不起作用)。 现在,我尝试通过使用一个大矩阵并创建矩阵块的Eigen::Refs来构建一个变通方法,但这不起作用,因为Refs没有默认构造函数。 此外,在处理参考文献时,它们或矩阵之间是否存在任何差异?这是因为我以后必须重新排列矩阵的组成部分 最小代码示例: 在h中: 我是否正确理解,当将Ref传递给函数时,我将它们作为Ref传递,并且可以访问它们的元素(如矩阵) 感谢^^的初始化,您

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

最小代码示例: 在h中:

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


感谢^^

的初始化,您可以编写:

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\u X\u zero
和其他类似的
MatrixXcd
,修改
vertex\u X\u zero
的条目将修改
vertex\u通道,反之亦然。当然,如果您将
vertex\u P\u zero
传递给一个需要
MatrixXcd
的函数,则会发生复制。您的函数必须是模板化的,或者编写为采用
Ref

非常感谢ggael:)在此期间,由于您的帮助,我能够用向量和refs^^两种方式使其工作。
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));
}
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();
}