Eigen库中矩阵与向量批量操作混合及原地运算实现问题
Eigen矩阵与向量混合批量运算问题解决
错误原因
编译错误YOU_CANNOT_MIX_ARRAYS_AND_MATRICES源于混合了Eigen的**数组(Array)与矩阵(Matrix)**两种不兼容的表达式类型:ref_landmarks.array().rowwise()返回数组类型的行-wise表达式,而ref_offset是矩阵类型的Vector3f,两者无法直接运算。
问题1:合法实现矩阵与向量的混合批量运算
有两种简洁的合规实现方式:
- 方式1:基于矩阵原生操作
Eigen的Matrix类型原生支持rowwise()/colwise()与向量的广播运算,无需转换为Array:Eigen::MatrixX3f ref_landmarks_offset = ref_landmarks.rowwise() - ref_offset; - 方式2:统一为数组类型操作
若需要使用Array的逐元素特性,可将向量也转换为Array类型,保持类型一致:Eigen::MatrixX3f ref_landmarks_offset = ref_landmarks.array().rowwise() - ref_offset.array();
问题2:无需额外矩阵的原地运算实现
直接在原矩阵上执行行-wise减法赋值,完全利用Eigen的向量化优化,避免手动循环:
ref_landmarks.rowwise() -= ref_offset;
完整修正示例代码
constexpr int landmarks_size = 3; constexpr float fScale = 2.0f; Eigen::MatrixX3f ref_landmarks(landmarks_size, 3); ref_landmarks.setRandom(); Eigen::Vector3f offset(1.0f, 2.0f, 3.0f); Eigen::Vector3f ref_offset = offset * fScale; // 创建新矩阵的批量运算 Eigen::MatrixX3f ref_landmarks_offset = ref_landmarks.rowwise() - ref_offset; // 原地修改原矩阵 ref_landmarks.rowwise() -= ref_offset;
内容的提问来源于stack exchange,提问作者Andrey Honich
相关产品推荐
相关产品推荐

