将Eigen::Matrix行转换为float数组时数据错乱问题求助
问题分析与解决
问题原因
Eigen默认采用**列优先(ColMajor)**存储矩阵,你的2x3矩阵在内存中的实际存储顺序是:
[2.59586, -1.38773, 2.49855, -0.816717, 37, 1.5]
当你调用state.row(0).data()时,虽然指针指向第一行第一个元素2.59586,但由于内存是列优先排列,array_state[1]会取到同一列的下一行元素-1.38773,而非第一行的第二个元素2.49855,这就是你得到错误输出的原因。
解决方案
方案1:将行向量复制到连续内存块
因为row(0)返回的是一个非连续的视图(列优先矩阵下),需要先将其复制到连续的数组或矩阵中再取指针:
// 方法A:用Eigen::Map直接复制到数组 float array_state[3]; state.row(0).copyTo(Eigen::Map<Eigen::Matrix<float, 1, 3>>(array_state)); // 方法B:先复制到临时行矩阵 Eigen::Matrix<float, 1, 3> row0 = state.row(0); float* array_state = row0.data();
之后再用printf输出就能得到预期结果:2.59586, 2.49855, 37。
方案2:改用行优先存储矩阵(仅适用于可修改矩阵定义的场景)
如果可以修改state的定义,将其指定为行优先(RowMajor)存储,这样行元素在内存中是连续的:
Eigen::Matrix<float, 2, 3, Eigen::RowMajor> state;
此时直接调用state.row(0).data(),数组下标访问就能按行顺序取到元素。
注意事项
Eigen的row()、col()等返回的是表达式视图,并非总是连续内存,在列优先矩阵中访问行元素时,必须注意内存布局导致的连续访问问题,避免直接用data()指针按数组下标跨列访问。
内容的提问来源于stack exchange,提问作者Pietro Campolucci
相关产品推荐
相关产品推荐

