具有特征矩阵的 Stl 迭代器
Stl iterators with Eigen matrices
我有一些函数涉及 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
.
时创建 std::vector<Eigen::Vector2i> myVec
并在函数 isLeftOf
中使用 Eigen::Vector2<T>
现在我在使用 std::vector<SomeEigenType>
时遇到了一些麻烦,我正在寻找一种方法来使用相同的 isLeftOf(Eigen::Vector2...)
和 stl 函数,但我不明白如何做。
在 Eigen documentation or 中有一些信息如何在 Eigen::Vector 或 Matrix 上执行 stl 操作,但它们使用矩阵的普通数字,所以我无法将 Eigen::Vector2
发送到我的 [=14] =]函数。
有没有办法在我的 isLeftOf
接受 Eigen::Vector
类型的函数中使用具有 Eigen::Matrix
和处理条件的 stl 函数?
我还没有找到最好的解决方案,但现在我决定使用 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 迭代器,其值从 0
到 N-1
(其中 N
是矩阵的行数)并处理所选择的lambda(或标准)函数中的行。
使用 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
我有一些函数涉及 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
.
std::vector<Eigen::Vector2i> myVec
并在函数 isLeftOf
中使用 Eigen::Vector2<T>
现在我在使用 std::vector<SomeEigenType>
时遇到了一些麻烦,我正在寻找一种方法来使用相同的 isLeftOf(Eigen::Vector2...)
和 stl 函数,但我不明白如何做。
在 Eigen documentation or Eigen::Vector2
发送到我的 [=14] =]函数。
有没有办法在我的 isLeftOf
接受 Eigen::Vector
类型的函数中使用具有 Eigen::Matrix
和处理条件的 stl 函数?
我还没有找到最好的解决方案,但现在我决定使用 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 迭代器,其值从 0
到 N-1
(其中 N
是矩阵的行数)并处理所选择的lambda(或标准)函数中的行。
使用 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