特征垂直堆叠行到矩阵中
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 的新功能)。
感谢您的任何帮助。
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
的左上角,并返回一个代理对象,该对象包含对A
的引用,并跟踪已经分配给A
的条目数量(存储在m_row
、m_currentBlockRows
m_col
中)并重载operator,
将下一个表达式分配给a
的相应位置并相应地增加位置。最后,当该代理对象被销毁时(通常发生在";
"),析构函数检查A
的所有条目是否已填充(如果没有,则引发失败的断言)。
如果您更喜欢使用<< ,
语法,您还可以编写:
A.middleRows<2>(2*i) << ax, ay;
启用优化后,应生成与上述简单实现相同的代码(因此请选择您更容易阅读的代码)。
注意:从技术上讲,你可以在循环中使用CommaInitializer
,方法是在循环外构造它,将其分配给一个变量,然后只在循环中使用,
运算符。我故意不会提供有关如何执行此操作的更多详细信息......
operator <<
的重载一次填充整个矩阵。如果维度不匹配,则会收到遇到的运行时错误。
这样看。假设代码可以按预期工作(operator <<
插入一行?一次插入两行?)。如何连续两次调用operator <<
?现在每个矩阵都必须跟踪调用operator <<
的次数吗?或者相反,如果插入了部分行,应该如何处理?
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 特征命名访问向量段
- 将特征矩阵的向量设置为0
- QScrollArea:由垂直滚动条引起的水平滚动条
- 特征:模板函数中矩阵的平面图
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- basic_string的前导/尾部不区分空格的特征
- 特征 3 类的模板专用化
- 特征 c++:复矩阵的面积双曲正切(atanh)
- C++ 中的特征向量计算
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 有没有办法找到特征矩阵系数的中值?
- 如何将高维数据映射到特征类型?
- 将平面阵列重塑为复杂的特征类型
- 特征 LLT 模块给出不正确的结果?
- 特征模板化函数和维度
- 特征垂直堆叠行到矩阵中