在特征中使用std::nth_element和相关的询问

using std::nth_element in eigen and a related interrogation

本文关键字:element nth 特征 std      更新时间:2023-10-16

我正在自学c++和特征,也许这是一个简单的问题。

给定n和0"<"m"<"n,以及浮点的n向量d。具体化:

VectorXf d = VectorXf::Random(n)

我想要一个m向量d-prim onf整数,它包含小于或等于d的第m大条目。效率很重要。如果有平局在数据中,然后填充d的前m个条目小于它的第m个最大入口是可以的(我真的需要不大于第m个最大条目的m个数字的索引d)。

我试过(天真地):

float hst(VectorXf& d,int& m){
//  VectorXf d = VectorXf::Random(n);
    std::nth_element(d.data().begin(),d.data().begin()+m,d.data().end());
    return d(m);
}

但它有两个问题:

  1. 它不起作用
  2. 即使它确实有效,我仍然需要传递一次d的副本才能找到索引小于d(m)的那些条目中的一个。这有必要吗

最佳,

std::nth_element是您想要的(与我之前所说的相反)。它进行部分运算,使得范围[first, mth)中的元素小于范围[mth, last)中的元素。因此,在运行nth_element之后,您所要做的就是将第一个m元素复制到新的向量中。

VextorXf d = VectorXf::Random(n);
VectorXi d_prim(m);
std::nth_element(d.data().begin(), d.data.begin() + m, d.data().end());
std::copy(d.data().begin(), d.data().begin() + m, d_prim.begin());

这个答案有更多关于算法的信息。

把David Brown和Kerrek SB的答案放在一起,我认为这是"最有效的提议":

VectorXi hst(VectorXf& d,int& h){
    VectorXf e = d;
    VectorXi f(h); 
    int j=0;
    std::nth_element(d.data(),d.data()+h,d.data()+d.size());
    for(int i=0;i<d.size();i++){
        if(e(i)<=d(h)){
            f(j)=i;
            j++;
        if(j==h) break; 
        } 
    }
    return f;
}