在std向量内向Eigen :: Vector2d分配元素会引发错误

时间:2018-04-13 06:03:43

标签: c++ eigen eigen3

我浏览了几篇StackOverflow帖子,但没有发现这样的错误。我正在尝试编写一个简单的类,它对documentation向量和矩阵进行一些操作。我创建了一个名为MyClass的类,它有一个名为MyMethod的方法。它的代码如下

void MyClass::MyMethod(Eigen::Vector4f X, 
                       std::vector<Eigen::Vector2i> &pixelIndices,
                       std::vector<Eigen::Vector4f> vertices)
{
   // Do some preprocessing

   //Deleacring the std vector
   std::vector<Eigen::Vector2i> currTriangle(3);
   currTriangle[0] = Eigen::Vector2i(0); //Error occurs here

   // Do some more processing
}

从主函数执行方法时,在所述语句中发生错误。错误输出如下所示。

$: ./test1 
test1: /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:285: void Eigen::PlainObjectBase<Derived>::resize(Eigen::Index) [with Derived = Eigen::Matrix<int, 2, 1>; Eigen::Index = long int]: Assertion `((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime==Dynamic || size<=MaxSizeAtCompileTime)) || SizeAtCompileTime == size) && size>=0' failed.
Aborted (core dumped)

我知道使用带有Eigen的STL容器是有问题的,但正如{{3}}中提到的那样,问题似乎只是固定大小的可矢量化特征类型(即它们应该是16字节大小),但是Vector2i不是这样的特征类型。 assert语句在PlainObjectBase的resize()方法中调用,这也很奇怪,因为我还没有在代码中的任何地方使用它。

还有其他人遇到此错误吗?任何帮助将非常感激。

更新: 错误似乎不是因为我使用了std :: vector。我对代码做了一些小改动。

  void MyClass::MyMethod(Eigen::Vector4f X, 
                         std::vector<Eigen::Vector2i> &pixelIndices,
                         std::vector<Eigen::Vector4f> vertices)
{
   // Do some preprocessing

   Eigen::Vector2i temp(0); //Same Error occures here also
   //Deleacring the std vector
   std::vector<Eigen::Vector2i> currTriangle(3);
   currTriangle[0] = Eigen::Vector2i(0);

   // Do some more processing
}

因此,初始化Vector2i时似乎发生了错误。

1 个答案:

答案 0 :(得分:1)

正如@MarcGlisse指出的那样,href="./style/bootstrap.min.css告诉构造一个带有Vector2i(0)元素的Vector2i,这些元素在运行时会失败。使用单个标量构造的固定大小的矩阵/向量将其解释为大小而不是值的原因是允许泛型函数,其中不清楚大小是动态的还是固定的:

0

有两种边界情况:将两个整数传递给具有两个元素的向量或将一个整数传递给具有一个元素的向量,将导致向量初始化为如果向量的标量类型可以从传递的整数类型隐式构造 - 否则,它将被解释为大小。

要解决您的原始问题,有以下几种选择:

template<int SizeAtCompileTime>
void foo(){
    Eigen::Matrix<int, SizeAtCompileTime, 1> v(actualSize);
    // ...
}