我有一个类可以找到一组2D点的凸包。它包含一个内部有2 Eigen::Matrix<double, 2, 1>
的结构。它看起来像这样(删除了很多东西):
class Foo{
public:
Foo(Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>);
private:
struct edge{
unsigned int a;
unsigned int b;
Eigen::Matrix<double, 2, 1> slope;
double mag;
Eigen::Matrix<double, 2, 1> normal;
std::vector<unsigned int> list;
};
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> points;
std::vector<edge> edges
};
向向量edges
添加边时,我收到一个断言错误:
void Foo::DoThing(){
edges.push_back(edge());
}
确切的错误是:
断言失败:(reinterpret_cast(array)&amp; 0xf)== 0&amp;&amp; &#34;这个断言在这里解释:&#34; &#34; http://eigen.tuxfamily.org/dox-devel/group__TopicUnalign edArrayAssert.html&#34; &#34; ****阅读本网页!!! ****&#34;,文件 \ blah \ blah \ blah \ includes \ eigen \ eigen-eigen-dc6cfdf9bcec \ eigen \ src \ core \ densestorage.h,第86行
我去了网页,读到我需要添加这个宏:
我在结构中添加的EIGEN_MAKE_ALIGNED_OPERATOR_NEW
如下:
struct edge{
unsigned int a;
unsigned int b;
Eigen::Matrix<double, 2, 1> slope;
double mag;
Eigen::Matrix<double, 2, 1> normal;
std::vector<unsigned int> list;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
但错误仍在继续。这与VS 2013和Eigen版本3.2.9一起发生。未经修改的相同代码适用于版本3.2.0。在使用GCC版本5.3的Linux上,它可以与Eigen的beta版本一起使用。这个新版本导致这个问题我做错了什么?
答案 0 :(得分:3)
您有一个std::vector
,其中包含要对齐的固定大小的特征类型。
问题是std::vector<edge>
其中edge
包含固定大小对齐的Eigen::Matrix<double, 2, 1>
。
在这里,EIGEN_MAKE_ALIGNED_OPERATOR_NEW
是不够的,您还需要选择Eigen的对齐分配器,如https://eigen.tuxfamily.org/dox/group__TopicStlContainers.html
在固定大小的可矢量化特征类型上使用STL容器,或者具有此类类型成员的类>,需要采取以下两个步骤: (i)必须使用16字节对齐的分配器。 Eigen确实提供了一个可供使用的:aligned_allocator。 (ii)如果你想使用 std :: vector容器,你需要
#include <Eigen/StdVector>
。
您应该大致更正您的代码(未经测试):
#include<Eigen/StdVector>
class Foo {
...
std::vector<edge,Eigen::aligned_allocator<edge> > edges;
}
警告:在Linux上你很幸运它有效(可能因为32位/ 64位),你的代码应该得到纠正。