Using std::map with Eigen 3

Using std::map with Eigen 3

本文关键字:Eigen with map std Using      更新时间:2023-10-16

为了提高效率,我需要编写一个代码,该代码采用特征 3 中定义的整数向量 VectorXi,并将该向量映射到字符。就像Python中的字典一样。我该怎么做?Eigen 文档以相反的方式做事(见下文) - 它将字符映射到向量。我无法让它反向工作。以前有人尝试过吗?

std::map<char,VectorXi, std::less<char>,
     Eigen::aligned_allocator<std::pair<char, VectorXi> > > poop;
VectorXi check(modes);
check << 0,2,0,0;
poop['a']=check;
cout << poop['a'];

您的代码正在尝试从完全相反的一端接近解决方案。在那里,您将构造一个映射,其中键的类型为 char,值为特征向量。

进一步请注意,根据特征主页,自定义分配器仅适用于特征类型的固定大小版本。

为了使用以特征向量作为键的std::map,您需要一个适当的比较函数。为此,您可以专门化自定义类型允许std::less。下面是一个可能的实现:

namespace std
{
     template<>
     std::less<Eigen::VectorXi>(Eigen::VectorXi const& a, Eigen::VectorXi const& b)
     {
          assert(a.size()==b.size());
          for(size_t i=0;i<a.size();++i)
          {
               if(a[i]<b[i]) return true;
               if(a[i]>b[i]) return false;
          }
          return false;
     }
}

然后你应该能够写

std::map<VectorXi, char> poop;
VectorXi check;
check << 0,2,0,0;
poop[check]='a';
cout << poop[check];  //prints 'a'

但是,上面的代码未经测试。