Eigen逗号初始化器是否接受0向量?

Whether does Eigen comma initializer accept 0 vector?

Eigen::VectorXi a, b, aAndb;
a.resize(10);
b.resize(0);
aAndb.resize(10);    

aAndb << a, b;

请阅读以上代码。基本上,我有一个长度为 10 的向量 'a' 和一个长度为 0 的向量 'b'。当我使用它们创建 aAndb 时,它在 CommaInitializer class 析构函数中给我一个断言失败.但是,如果'b'的长度大于0,则没有错误。我正在使用 Eigen 3.2.9。这是 Eigen 的正确回复还是因为我的用法有误?

您之前的其他人似乎遇到了同样的问题 here。如果您遵循 link,Eigen 3.1.0 有一个补丁允许您在逗号初始值设定项列表中使用空向量。我自己没有试过这个补丁。

这个问题最近已在 3.2 和开发分支中得到修复。您可以等待 3.2.10 或获得 3.2 分支的负责人 there.

逗号初始值设定项创建并排列。

// From Eigen 3.2.9
/* inserts a matrix expression in the target matrix */
template<typename OtherDerived>
CommaInitializer& operator,(const DenseBase<OtherDerived>& other)
{
  if(other.rows()==0)
  {
    m_col += other.cols();
    return *this;
  }
  ...

来自彼得回答中链接的补丁

template<typename OtherDerived>
CommaInitializer& operator,(const DenseBase<OtherDerived>& other)
{
+    if(other.cols()==0 || other.rows()==0)
+      return *this;
     if (m_col==m_xpr.cols())

dev 分支(以及 3.1 和 3.2 分支,但 3.2.9 中没有)发生了变化:

/* inserts a matrix expression in the target matrix */
template<typename OtherDerived>
EIGEN_DEVICE_FUNC
CommaInitializer& operator,(const DenseBase<OtherDerived>& other)
{
    if (m_col==m_xpr.cols() && (other.cols()!=0 || other.rows()!=m_currentBlockRows))
    {
       m_row+=m_currentBlockRows;
       m_col = 0;
       m_currentBlockRows = other.rows();
       eigen_assert(m_row+m_currentBlockRows<=m_xpr.rows()
         && "Too many rows passed to comma initializer (operator<<)");
    }

已解决 here (Christoph's comment)。