Eigen矩阵初始化报错:如何合并多个已有矩阵构建目标矩阵?
Fixing Eigen Comma Initializer Error When Stacking Matrices Vertically
嘿,我看你在Eigen里合并矩阵时遇到了逗号初始化的报错,咱们来拆解问题并解决它~
问题根源分析
你代码里有两个关键错误:
- 矩阵尺寸不匹配:你想要的是4行2列的矩阵A,但一开始把它定义成了
MatrixXd A(4,4);,这和最终期望的输出尺寸完全不符。 - 拼接方式语法错误:Eigen的逗号初始化
A << B, C;默认是水平拼接(把C放在B的右侧),但你需要的是垂直拼接(把C放在B的下方),这种写法会导致填充的元素数量和矩阵尺寸不匹配,直接触发断言错误。
正确解决方案
方法1:使用逗号初始化的垂直堆叠写法
先修正A的尺寸,然后通过换行的方式告诉Eigen要垂直拼接矩阵:
#include <Eigen/Dense> #include <iostream> using namespace Eigen; int main() { // 正确定义A为4行2列,匹配期望输出 MatrixXd A(4, 2); MatrixXd B(2, 2); MatrixXd C(2, 2); // 初始化B和C B << 1, 2, 3, 4; C << 5, 6, 7, 8; // 垂直拼接:先填充B的所有行,再填充C的所有行 A << B, C; std::cout << "A = \n" << A << std::endl; return 0; }
方法2:使用Eigen的VerticalStack函数(Eigen 3.4+)
如果你使用的是Eigen 3.4及以上版本,还可以用更直观的垂直堆叠函数,不需要手动指定A的尺寸:
#include <Eigen/Dense> #include <iostream> using namespace Eigen; int main() { MatrixXd B(2, 2); MatrixXd C(2, 2); B << 1, 2, 3, 4; C << 5, 6, 7, 8; // 自动垂直堆叠,返回4行2列的矩阵 MatrixXd A = MatrixXd::VerticalStack(B, C); std::cout << "A = \n" << A << std::endl; return 0; }
为什么原来的代码报错?
你之前的A << B, C;在A是4x4的情况下,Eigen会尝试把B放在A的前2行前2列,C放在前2行的后2列,这样只填充了4个元素,但4x4的矩阵需要16个元素,剩余的12个元素没有被赋值,所以触发了断言错误:"Too few coefficients passed to comma initializer (operator<<)"。
内容的提问来源于stack exchange,提问作者coderide
相关产品推荐
相关产品推荐

