繁体   English   中英

按升序排序特征向量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按元素的弱排序定义的升序排序。 默认情况下,它使用元素上的< operator defined,但它也可以使用函数对象或函子来提供比较。 这个仿函数需要使用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 implementation x <y

  • std::greater_equal实现x> = y

  • std::less_equal实现x <= y

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

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

这将按向量按降序对矢量表示的范围进行排序。

但是,由于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); 
    });

注意:选择使用哪种eigensolver时要小心。 您可以在这里找到使用哪一个: 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM