我一口气教自己c ++和eigen, 所以这可能是一个简单的问题。
给定n和0"<" m"<" n和浮点数的n向量d。使其具体化:
VectorXf d = VectorXf::Random(n)
我想有一个包含m的向量d_prim onf整数 d的所有条目的索引小于或等于 d的第m个最大入口。效率很重要。如果有抽奖 在数据中,然后填充d_prim 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);
}
但它有两个问题:
最佳,
答案 0 :(得分: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());
This answer有更多关于算法的信息来执行此操作。
答案 1 :(得分: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;
}