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<<)");
}
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<<)");
}