CodeLLDB调试中两类Eigen::Matrix模板参数有何含义
Eigen::Matrix模板参数与CodeLLDB调试显示说明
你在调试器变量面板看到的尖括号内的模板参数,全部是该矩阵变量的编译期类型属性,和运行时的实际尺寸没有直接关系,不会随resize等运行时操作改变,这也是你观察到参数值不匹配实际尺寸的根本原因。
Eigen::Matrix<>尖括号内,第一个参数是矩阵存储元素的标量类型,后续紧跟的5个参数按顺序含义如下:
- 编译期固定行数(
RowsAtCompileTime,全参数列表第二位):正整数代表该矩阵类型在编译阶段就锁定了行数,运行时不可修改行数;值为-1对应Eigen内置的Dynamic常量,代表行数为运行时动态确定,编译期不做固定限制。 - 编译期固定列数(
ColsAtCompileTime,全参数列表第三位):规则和行数完全一致,正整数为编译期固定列数,-1代表动态列。 - 存储配置位掩码(
Options,全参数列表第四位):按位组合的配置值,用来控制矩阵的存储顺序(列优先/行优先)、内存对齐规则等底层属性,不属于尺寸参数。你观察到的0是动态尺寸矩阵的默认配置(列优先存储),4是固定尺寸矩阵默认开启内存对齐的配置值。 - 编译期最大行数限制(
MaxRowsAtCompileTime,全参数列表第五位):固定尺寸矩阵的该值和编译期固定行数相等,动态尺寸矩阵如果没有手动设置编译期行数上限,该值为-1。 - 编译期最大列数限制(
MaxColsAtCompileTime,全参数列表第六位):规则和最大行数一致,固定尺寸矩阵等于固定列数,无上限的动态矩阵值为-1。
你观察到的两种显示差异,本质是两个程序中矩阵的静态类型不同,和初始化、resize流程无关:
- 显示为
Eigen::Matrix<float, 4, 4, 4, 4, 4>的是固定尺寸4x4单精度矩阵,对应常用的Eigen::Matrix4f类型,这种类型在编译期就锁定了4行4列,内存通常直接在栈上分配,不需要动态resize就已经是4x4尺寸。 - 显示为
Eigen::Matrix<float, -1, -1, 0, -1, -1>的是全动态尺寸单精度矩阵,对应Eigen::MatrixXf类型,这种类型编译期不固定行列数,内存从堆上分配,默认初始化时实际行列数为0,需要手动resize或者赋值才会设置为目标尺寸。
两个程序功能接近但矩阵类型不同,通常是变量声明方式差异导致:比如一处直接用Eigen::Matrix4f声明,另一处用了auto推导、类型别名或者模板参数生成了动态矩阵类型,哪怕后续都把尺寸调整为4x4,变量的静态类型不会改变,调试器显示的模板参数自然会有差异。
内容的提问来源于stack exchange,提问作者mcExchange
相关产品推荐
相关产品推荐

