1

私は独学で c++ と固有値を一度に学んでいるので、これは簡単な質問かもしれません。

n と 0 "<" m "<" n と、float の n-ベクトル d が与えられます。具体的にするには:

VectorXf d = VectorXf::Random(n)

d の m 番目に大きいエントリより小さいか等しい d のすべてのエントリのインデックスを含む m-vector d_prim onf integers が必要です。効率が重要です。データに描画がある場合、d_prim に、その m 番目に大きいエントリよりも小さい d の最初の 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);
}

しかし、それには2つの問題があります:

  1. うまくいきません
  2. 機能したとしても、d(m) より小さいエントリのインデックスを見つけるために、d の (コピー) を 1 回渡す必要があります。これは必要ですか?

一番、

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 に答える