带有特征矩阵的 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> myVec 时创建了 Eigen::Vector2<T>,并在函数 isLeftOf 中使用了 std::min_element

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

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

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

解决方法

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

,

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

{
  "responseJson": {
    "prompt": {
      "firstSimple": {
        "speech": "Vale,te muestro los últimos artículos"
      },"content": {
        "list": {
          "title": "Últimos artículos","items": [
            {
              "key": "ITEM_1"
            },{
              "key": "ITEM_2"
            },{
              "key": "ITEM_3"
            }
          ]
        }
      }
    },"scene": {
      "name": "Articles","slotFillingStatus": "COLLECTING","slots": {
        "prompt_option": {
          "mode": "REQUIRED","status": "SLOT_UNSPECIFIED","updated": false
        }
      }
    },"session": {
      "id": "[...]","params": {
        "choosen_option": "Portada"
      },"typeOverrides": [
        {
          "name": "prompt_option","mode": "TYPE_REPLACE","synonym": {
            "entries": [
              {
                "name": "ITEM_1","synonyms": [
                  "Item 1","Primer item"
                ],"display": {
                  "title": "Artículo 1","description": "Descripción del artículo 1"
                }
              },{
                "name": "ITEM_2","synonyms": [
                  "Item 2","Segundo item"
                ],"display": {
                  "title": "Título del artículo 2","description": "Resumen del artículo 2"
                }
              },{
                "name": "ITEM_3","synonyms": [
                  "Item 3","Tercer item"
                ],"display": {
                  "title": "Título del artículo 3","description": "Resumen del artículo 3"
                }
              }
            ]
          }
        }
      ],"languageCode": ""
    },"user": {
      "locale": "es-ES","params": {},"accountLinkingStatus": "ACCOUNT_LINKING_STATUS_UNSPECIFIED","verificationStatus": "VERIFIED","packageEntitlements": [],"gaiamint": "","lastSeenTime": "2021-01-05T15:14:30Z"
    },"home": {
      "params": {}
    },"device": {
      "capabilities": [
        "SPEECH","RICH_RESPONSE","LONG_FORM_AUDIO"
      ]
    }
  }
}

主要思想是在索引向量上应用stl迭代器,其值从#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(),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; } 0(其中N-1是矩阵的行数)并处理在lambda(或标准)函数。