c++ - Eigen 垂直堆叠行成矩阵

标签 c++ eigen eigen3

我想创建一个大小为 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 的新手)。

感谢您的帮助。

最佳答案

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)分配 bA 的左上角并返回一个代理对象,其中包含对 A 的引用并跟踪 A 的条目数量已经分配给(存储在 m_rowm_currentBlockRowsm_col )和重载 operator,它将下一个表达式分配给 a 的相应位置并相应增加仓位。最后,当该代理对象被破坏时(通常发生在“;”),析构函数检查是否所有条目A已被填充(如果没有,则引发失败的断言)。

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

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

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


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

关于c++ - Eigen 垂直堆叠行成矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58577439/

相关文章:

c++ - <Windows>为什么 std::thread::native_handle 返回类型为 'long long unsigned int' 的值而不是 void*(又名 HANDLE)?

c++ - 传递 std::optional<std::shared_ptr<Data>> 作为参数的最佳替代方法?

c++ - boost 功能的奇怪行为

c++ - Eigen3 矩阵随机

c++ - 无法实现单例模式

c++ - "A = Obj()"和 "A = new Obj()"有什么区别

c# - 两张脸对比

c++ - Eigen 中正确的模板初始化

c++ - 使用元胞数组在 C++ 特征矩阵和 MATLAB mxArray 之间传递数据

c++ - 为什么 "const Eigen::Matrix<>&"和 "const Ref<Eigen::Matrix<>>"显然不兼容?