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

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

在Eigen文档或论坛中,有一些关于如何对Eigen::Vector或Matrix执行stl运算的信息,但它们使用矩阵的普通数,所以我无法将Eigen::Vector2发送到我的isLeftOf函数。

有没有一种方法可以将stl函数与Eigen::Matrix一起使用,并在我的函数(如接受Eigen::Vector类型的isLeftOf(中处理条件?

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

假设CCD_ 13是一个矩阵;最左边的";列:

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函数:

#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;
}

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

相关内容

  • 没有找到相关文章

最新更新