如何为RowMajor存储顺序的Eigen矩阵创建Eigen::Ref引用?
解决Eigen RowMajor矩阵的引用绑定问题
问题核心在于**Eigen::Ref的模板参数与目标表达式的存储顺序不匹配**:默认的VectorXf、MatrixXf都是列主序(ColMajor),而RowMajor矩阵生成的reshaped<RowMajor>、矩阵块等表达式是行主序的,直接绑定会触发Eigen的类型检查错误。
以下是针对两个场景的修正方案:
1. 绑定RowMajor重塑后的向量引用
需要让Ref的模板参数匹配RowMajor的一维存储顺序,可直接指定行主序的向量类型:
// 用RowMajor的一维矩阵作为Ref目标类型,对应按行展平的向量 Eigen::Ref<Eigen::Matrix<float, Eigen::Dynamic, 1, Eigen::RowMajor>> mat_row_major_ref_vect = mat_row_major.reshaped<Eigen::RowMajor>();
如果业务需要行向量形式,也可以直接用RowVectorXf:
Eigen::Ref<Eigen::RowVectorXf> mat_row_major_ref_vect = mat_row_major.reshaped<Eigen::RowMajor>();
2. 绑定RowMajor矩阵的块引用
将Ref的模板参数改为RowMajor的动态矩阵类型,匹配原矩阵的存储顺序:
Eigen::Ref<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> mat_row_major_ref_block = mat_row_major.block(0, 0, 2, 6);
完整修正代码
#include <iostream> #include <eigen3/Eigen/Dense> int main() { Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> mat_row_major(5, 6); mat_row_major << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 ; // 绑定RowMajor重塑后的向量引用 Eigen::Ref<Eigen::Matrix<float, Eigen::Dynamic, 1, Eigen::RowMajor>> mat_row_major_ref_vect = mat_row_major.reshaped<Eigen::RowMajor>(); // 绑定RowMajor矩阵的块引用 Eigen::Ref<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> mat_row_major_ref_block = mat_row_major.block(0, 0, 2, 6); // 验证输出 std::cout << "Reshaped vector:\n" << mat_row_major_ref_vect << "\n\n"; std::cout << "Block matrix:\n" << mat_row_major_ref_block << "\n"; }
补充说明
Eigen的Ref对存储顺序、步长(stride)有严格匹配要求:
- RowMajor矩阵的
block返回的表达式仍保持RowMajor存储; reshaped<RowMajor>会生成按行优先展平的一维表达式,存储顺序为RowMajor;- 必须保证
Ref的模板参数与目标表达式的存储顺序完全一致,才能成功绑定引用。
内容的提问来源于stack exchange,提问作者RaZ0rr
相关产品推荐
相关产品推荐

