Eigen::Matrix的vector容器定义、取值及相比多维矩阵的优势问询
首先先展示你提到的代码:
typedef Eigen::Matrix<float, Eigen::Dynamic, 1> sensorMatrix; template <template <typename, typename> class Container, typename Type> Container<std::vector, Eigen::aligned_allocator<sensorMatrix>> sensorContainer;
问题1:模板定义的作用,以及容器的生成逻辑
这行用了C++的模板模板参数语法,设计意图是定义一个适配Eigen类型的通用容器模板:
- 第一个模板参数
Container本身是一个需要接收两个类型参数的模板(比如STL的std::vector、std::deque都符合这个要求,第一个参数是容器存储的元素类型,第二个是内存分配器类型) - 这里直接指定了容器的分配器为
Eigen::aligned_allocator<sensorMatrix>,这是Eigen的特殊要求:Eigen中需要内存对齐的类型(比如带SIMD优化的矩阵类型)存入STL容器时,必须用对齐分配器,否则会触发运行时断言错误或者段错误 - 注:你贴的这段代码存在笔误,第二个模板参数
Type没有被使用,按设计逻辑应该是把Type作为容器的元素类型,这里写死了元素是sensorMatrix,所以实际使用时可以直接把第二个参数删掉
问题2:存储Eigen::Matrix的vector以及取值方式
可以存储,你需要先对模板进行实例化:
// 实例化出存储sensorMatrix的vector using sensorVector = std::vector<sensorMatrix, Eigen::aligned_allocator<sensorMatrix>>; sensorVector sensorContainer;
取值逻辑需要注意:你定义的sensorMatrix是动态大小的列向量,只有1列,所以正确的取值方式是:
// 取第i个向量的第j行的值,列坐标固定为0可以省略 float val = sensorContainer[i](j);
如果你后续把sensorMatrix改成二维动态矩阵,就可以用你写的sensorContainer[i](j,k)的方式取值。
问题3:设计优势以及和直接用Eigen二维矩阵的区别
这种设计的优势主要有三个:
- 完全兼容STL容器接口,可以直接用
push_back、迭代器、范围for循环、STL算法等操作容器,和其他接受STL容器的工具库适配成本更低 - 适配动态异构的场景:每个子矩阵可以是不同大小的Eigen矩阵,增删子矩阵的开销远低于调整整块连续内存的Eigen二维矩阵
- 封装了对齐分配器的逻辑,不需要每次定义容器都手动写分配器参数,减少手写代码出错的概率
不用直接Eigen二维矩阵的核心原因是业务场景差异:Eigen的二维矩阵是一整块连续内存,仅适合规整的二维数值运算场景,如果你的业务是每次采集一个sensor向量存入容器、需要频繁增删元素、或者子矩阵大小不固定,用STL容器套Eigen矩阵的方案灵活度和性能都更好。
内容的提问来源于stack exchange,提问作者Emilio7773
相关产品推荐
相关产品推荐

