如何解决带有特征矩阵的 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 documentation 或 in 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(或标准)函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。