首页 > 解决方案 > 具有特征矩阵的 Stl 迭代器

问题描述

我有一些涉及 stl 迭代器的函数,并且适用于std::vector<Eigen::Vector2d>. 例如:

template<typename T>
bool isLeftOf(const Eigen::Vector2<T>& a,
              const Eigen::Vector2<T>& b) {
  return (a.x() < b.x() || (a.x() == b.x() && a.y() < b.y()));
}

int main()
{
  std::vector<Eigen::Vector2i> myVec;
  myVec.push_back(Eigen::Vector2i::Random(2));
  myVec.push_back(Eigen::Vector2i::Random(2));
  myVec.push_back(Eigen::Vector2i::Random(2));
  myVec.push_back(Eigen::Vector2i::Random(2));
  myVec.push_back(Eigen::Vector2i::Random(2));
  
  Eigen::Vector2i element = *std::min_element(myVec.begin(), myVec.end(), isLeftOf<int>);

  return 0;
}

如您所见,std::vector<Eigen::Vector2i> myVecEigen::Vector2<T>isLeftOf调用std::min_element.

现在我在使用时遇到了一些麻烦std::vector<SomeEigenType>,我正在寻找一种使用相同isLeftOf(Eigen::Vector2...)和 stl 函数的方法,但我不明白如何。

Eigen 文档论坛中,有一些信息如何在 Eigen::Vector 或 Matrix 上执行 stl 操作,但它们使用纯数字矩阵,所以我无法发送Eigen::Vector2到我的isLeftOf函数。

有没有办法Eigen::Matrix在我的函数中使用 stl 函数并处理条件,比如isLeftOf接受Eigen::Vector类型?

标签: c++eigeneigen3

解决方案


使用 Eigen 的主版本,您可以使用类似 STL 的迭代器来访问矩阵的行或列:

假设myVec是一个矩阵,你可以这样写来得到“最左边”的列:

  Eigen::Vector2i element = *std::min_element(
      myVec.colwise().begin(), myVec.colwise().end(), 
      [](auto const& a, auto const& b){
          return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
      });

Godbolt 演示:https ://godbolt.org/z/n1Y8hf


推荐阅读