【问题标题】:Stl iterators with Eigen matrices具有特征矩阵的 Stl 迭代器
【发布时间】:2021-01-05 04:01:47
【问题描述】:

我有一些涉及 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::min_element 时在函数isLeftOf 中创建std::vector&lt;Eigen::Vector2i&gt; myVec 并使用Eigen::Vector2&lt;T&gt;

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

Eigen documentationin the forum 中有一些信息如何在 Eigen::Vector 或 Matrix 上执行 stl 操作,但它们适用于普通数字矩阵,因此我无法将 Eigen::Vector2 发送到我的 isLeftOf 函数。

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

【问题讨论】:

    标签: c++ eigen eigen3


    【解决方案1】:

    使用 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

    【讨论】:

    • 非常感谢!这正是我一直在寻找的
    【解决方案2】:

    我还没有找到最好的解决方案,但现在我决定使用 lambda 函数:

    #include <algorithm>
    #include <Eigen/Dense>
    
    int main()
    {
      Eigen::MatrixX2f M;
    
      /*
       *  fill matrix M as you need
       * */
      
      // initialize original index locations from 0 to N-1
      Eigen::VectorX<Eigen::Index> idx =
          Eigen::ArrayX<Eigen::Index>::LinSpaced(
            M.rows(), 0, M.rows()-1);
    
      std::function<bool(const Eigen::Index &, const Eigen::Index &)> isLeftOf_fun = 
          [&M](
          const Eigen::Index& row1,
          const Eigen::Index& row2)->bool
      {
        return (M(row1,0) < M(row2,0) || (M(row1,0) == M(row2,0) && M(row1,1) < M(row2,1)));
      };
    
      Eigen::Index ia = *min_element(idx.begin(), idx.end(), isLeftOf_fun);
      Eigen::Vector2f element = M.row(ia);
    
      return 0;
    }
    

    主要思想是在索引向量上应用stl迭代器,其值从0N-1(其中N是矩阵的行数)并在lambda(或标准)中处理所选行功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2018-08-11
      • 2022-06-14
      • 2016-07-02
      相关资源
      最近更新 更多