按升序对特征向量Xf进行排序

sort eigen vectorXf in ascending order

本文关键字:排序 Xf 向量 升序 特征      更新时间:2023-10-16

我正在尝试按升序对EigenVectorXfx进行排序。

这将按降序排序:

std::sort(x.data(),x.data()+x.size());

这不起作用:

bool myfunction (int i,int j) { return (i<j); }
std::sort(x.data(),x.data()+x.size(),myfunction);

有什么想法吗?

前言
由于最初的问题被证明是一个误解,并且其中的代码已经是正确的答案,我决定写一些关于一般使用std::sort的内容。

std::sort按元素的弱顺序定义的升序对范围进行排序。默认情况下,它使用在元素上定义的<运算符,但它也可以采用函数对象或函子来提供比较。这个函子需要具有适当的重载函数,并签名为bool operator()(const T& lhs, const T& rhs) const。下面是一个示例:

struct FooSorter {
bool operator (const Foo& lhs, const Foo& rhs) const {
return lhs.ham_index < rhs.ham_index;
}
};
/* ... */
std::sort(begin(vec), end(vec), FooSorter());

这将根据FooSorteroperator()中定义的标准对vec表示的全部范围进行排序。

因为为简单的事情编写自定义函子(按降序排序,按升序排序)会很快变得痛苦,STL 提供了许多模板化函子,可以在函数头中使用。与排序相关的是:

  • std::equal_to实现 x == y

  • std::not_equal_to实现 x != y

  • std::greater实现 x> y

  • std::less实现 x

  • std::greater_equal实现 x>= y

  • std::less_equal实现 x <= y

所有这些都是模板化的,可用于实现所需运算符的任何类型。使用这些很容易:

std::sort(begin(vec), end(vec), std::greater<int>());

这将按降序对 vector 表示的范围进行排序。

但是,由于 STL 算法的最大问题之一是定义函子的痛苦,C++11 带来了一个新技巧:lambda 函数。这允许您以内联方式声明函数对象等效项。示例如下:

std::sort(begin(vec), end(vec), [](int lhs, int rhs){return rhs > lhs});

这也会按降序对 vector 表示的范围进行排序,但我们不必显式声明函子(或使用已经声明的函子)。(当实现更复杂的比较或不同 STL 算法的函子时,这会变得更好。

如果有人正在寻找答案,这里是我是如何做到的。通过这种方式,您还可以获得特征值和相应的特征向量。这里covariance_matrix是求解特征值和特征向量的矩阵。

std::vector<std::tuple<float, Eigen::VectorXf>> eigen_vectors_and_values; 
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> eigensolver(covariance_matrix);
if (eigensolver.info() != Eigen::Success) {
return;
}
Eigen::VectorXf eigen_values = eigensolver.eigenvalues();
Eigen::MatrixXf eigen_vectors = eigensolver.eigenvectors();
for(int i=0; i<eigen_values.size(); i++){
std::tuple<float, Eigen::VectorXf> vec_and_val(eigen_values[i], eigen_vectors.row(i));
eigen_vectors_and_values.push_back(vec_and_val);
}
std::sort(eigen_vectors_and_values.begin(), eigen_vectors_and_values.end(), 
[&](const std::tuple<float, Eigen::VectorXf>& a, const std::tuple<float, Eigen::VectorXf>& b) -> bool{ 
return std::get<0>(a) < std::get<0>(b); 
});

注: 选择要使用的特征求解器时要小心。您可以在此处找到要使用的一个:https://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html

感谢您对特征值和特征向量进行排序的完整答案。在 中返回 row() 是否正确

std::tuple<float, Eigen::VectorXf> vec_and_val(eigen_values[i], eigen_vectors.row(i));

从 Eigen 文档中的说明来看,它应该是 col()