1

我正在一次自学 c++ 和 eigen,所以也许这是一个简单的问题。

给定 n 和 0 "<" m "<" n,以及一个 n 向量 d 的浮点数。为了使其具体:

VectorXf d = VectorXf::Random(n)

我想要一个 m 向量 d_prim onf integers,其中包含 d 的所有条目的索引,这些条目小于或等于 d 的第 m 个最大条目。效率很重要。如果数据中有抽取,则填充 d_prim 的前 m 个小于其第 m 个最大条目的 d 条目就可以了(我真的需要不大于第 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) 的条目的索引。这是必要的吗?

最好的,

4

2 回答 2

1

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());

这个答案有更多关于算法的信息来做到这一点。

于 2012-02-29T23:04:07.780 回答
0

将 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;
}
于 2012-03-01T10:39:40.327 回答