本征垂直堆叠行成矩阵

Eigen vertical stacking rows into Matrix

我想创建一个大小为 2N x 9 的矩阵,其中 N 是通过垂直堆叠 2N 1x9 矩阵的动态值。

这是我尝试做的。

using CoefficientMatrix = Eigen::Matrix<T, Eigen::Dynamic, 9>;
using CoefficientRow = Eigen::Matrix<T, 1, 9>;

CoefficientMatrix A(2*N, 9);

for (int i = 0; i < N; i++) {
    CoefficientRow ax;
    CoefficientRow ay;
    // fill in ax and ay
    A << ax, ay;
}

但是,我收到以下运行时错误。

Assertion failed: (((m_row+m_currentBlockRows) == m_xpr.rows() || m_xpr.cols() == 0) && m_col == m_xpr.cols() && "Too few coefficients passed to comma initializer (operator<<)"), function finished, file /usr/local/include/eigen3/Eigen/src/Core/CommaInitializer.h, line 120.

我尝试通过断言语法进行解析,但我不确定这些内部变量名称在我的代码中指的是什么(Eigen 的新手)。

感谢您的帮助。

operator << 的重载一次填满了整个矩阵。如果尺寸不匹配,您将遇到运行时错误。

这样看。假设代码如您所愿(operator << 插入一行?一次插入两行?)。连续两次调用 operator << 是如何工作的?现在是否每个矩阵都必须跟踪 operator << 被调用了多少次?或者反过来,如果插入了部分行,应该如何处理?

TLDR:写这样的东西:

CoefficientMatrix A(2*N, 9);

for (int i = 0; i < N; i++) {
    CoefficientRow ax;
    CoefficientRow ay;
    // fill in ax and ay
    A.row(2*i)   = ax;
    A.row(2*i+1) = ay;
}

您出错的原因是(如 Avi 所解释的)operator<< 旨在一次填充整个矩阵。事实上,调用 operator<<(Array &A, Array const &b)b 分配给 A 的左上角, returns 一个代理对象,它持有对 A 的引用并保持跟踪有多少 A 的条目已经分配给(存储在 m_rowm_currentBlockRowsm_col 中)和重载 operator,,它将下一个表达式分配给相应的a 的位置并相应地增加位置。最后,当该代理对象被析构时(通常发生 "at the ;"),析构函数检查 A 的所有条目是否已被填充(如果没有,则引发失败的断言)。

如果您更喜欢使用 << , 语法,您还可以这样写:

    A.middleRows<2>(2*i) << ax, ay;

启用优化后,应该会生成与上述简单实现相同的代码(因此请选择对您来说更容易阅读的代码)。


N.B.: 从技术上讲,您可以在循环中(ab)使用 CommaInitializer,方法是在循环外构造它,将其分配给变量,然后仅使用 , 运算符在循环内。我会故意不提供有关如何执行此操作的更多详细信息...