gpt4 book ai didi

c++ - 在 std vector 中将元素分配给 Eigen::Vector2d 会引发错误

转载 作者:行者123 更新时间:2023-11-28 04:43:06 38 4
gpt4 key购买 nike

我浏览了几篇 StackOverflow 帖子,但没有发现此类错误。我正在尝试编写一个简单的类,它对 Eigen 执行一些操作。 vector 和矩阵。我创建了一个名为 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)

我知道将 STL 容器与 Eigen 一起使用是有问题的,但正如 documentation 中所述问题似乎只存在于固定大小的可向量化 Eigen 类型(即它们应该是 16 字节大小),但 Vector2i 不是这样的 Eigen 类型。 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的时候出错了。

最佳答案

正如@MarcGlisse 指出的那样,Vector2i(0) 告诉我们用0 元素构造一个Vector2i,这将在运行时失败。使用单个标量构造的固定大小的矩阵/vector 将其解释为大小而不是值的原因是允许通用函数,其中不清楚大小是动态的还是固定的:

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

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

要解决您原来的问题,有几种选择:

Eigen::Vector2i temp1(Eigen::Vector2i::Zero());
Eigen::Vector2i temp2(0,0);

// initialize all elements with a Zero vector:
std::vector<Eigen::Vector2i> currTriangle(3, Eigen::Vector2i::Zero());

currTriangle[0].setZero(); // set 0th element to Zero vector
currTriangle[0].setConstant(0); // equivalent to setZero, but works for arbitrary constants
currTriangle[0].array() = 0; // .array() lets you do element-wise operations

关于c++ - 在 std vector 中将元素分配给 Eigen::Vector2d 会引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49810270/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com