c++ - 在与 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 传递并且可以像矩阵一样访问它们的元素?
谢谢^^
解决方案
对于初始化,您可以编写:
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>
.
推荐阅读
- c - 如何在 macOS 上将 dylib 静态链接到我的程序?
- python-3.7 - 我正在尝试使用 Python 将 JSON 文件导入 MongoDB。我不断收到“ModuleNotFoundError: No module named 'pymongo'”错误
- swift - GKGoal toAvoid 被忽略
- reactjs - 意外的令牌<在反应打字稿中很浅
- css - 在内容获取期间覆盖 html-table
- node.js - nvm没有在mac上下载
- node.js - 我怎样才能正确地做出响应中的 fetch api 调用?
- tensorflow - Sparkfun 边缘消息“!!!有线升级不成功!!!....终止脚本”
- python - 列表中的连续字符
- python - tf.set_random_seed 似乎没有正确设置种子