按升序对特征向量Xf进行排序
sort eigen vectorXf in ascending order
我正在尝试按升序对Eigen
VectorXf
x
进行排序。
这将按降序排序:
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());
这将根据FooSorter
operator()
中定义的标准对vec表示的全部范围进行排序。
因为为简单的事情编写自定义函子(按降序排序,按升序排序)会很快变得痛苦,STL 提供了许多模板化函子,可以在函数头中使用。与排序相关的是:
std::equal_to
实现 x == ystd::not_equal_to
实现 x != ystd::greater
实现 x> ystd::less
实现 xstd::greater_equal
实现 x>= ystd::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()
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- 显示错误输出的简单数组排序程序
- 为什么我的排序算法会更改数组值
- 试图在c++中对数字列表进行排序
- 按升序对特征向量Xf进行排序