-1

ゴール

以下のコードはvector<vector<float> >、ガウス分布から乱数を取り込み、次のことを実行するように設計されています。

  1. nあるしきい値を超えるような最初の値に遭遇するまで、ベクトルのすべての列を同時に反復します。

  2. a) その値が最初に見つかった値とは異なる列から取得されるように、そのしきい値を超える 2 番目の値に遭遇するか、b) 反復の最大数を超えるまで反復を続けます。

  3. a) の場合、c) 値が最初に見つかった値と2 番目に見つかった値とは異なる列から取得されるように、しきい値を超える 3 番目の値を見つけるか、b) の最大数を超えるまで反復を続けます。最初に見つかった値からの反復。b) の場合、最初からやり直しますが、今回は最初に見つかった値の 1 行後に反復を開始します。

  4. c) の場合、カウンターに 1 を加算し、数x行前にジャンプします。d) の場合、最初からやり直しますが、今回は最初に見つかった値の 1 行後に反復を開始します。

これを達成する方法:

私の意見では、最も困難な部分は、3 つの値すべてが一意の列によって提供されるようにすることです。これに取り組むために、私はstd::set. の各行を反復処理してから、その行のvector<vector<float> >各列を反復処理します。しきい値を超える値について各列をチェックし、その列番号を std::set に格納します。

繰り返し続けています。に達するmax_iterationsと、最初に見つかった値の次の値に戻り、セットを空にして、カウンターをリセットします。std::setのサイズがの場合3、カウンターに 1 つ追加します。

私の問題:

このコードは、サイズが数十列、数十万から数百万行の多次元ベクトルで実行する必要があります。今のところ、それは耐え難いほど遅いです。可能であれば、パフォーマンスを大幅に改善したいと考えています。

私のコード:

void findRate(float thresholdVolts){

    set<size_t> cache;
    vector<size_t> index;

    size_t count = 0, found = 0;

    for(auto rowItr = waveform.begin(); rowItr != waveform.end(); ++rowItr){

        auto &row = *rowItr;

        for(auto colnItr = row.begin(); colnItr != row.end(); ++colnItr){

            auto &cell = *colnItr;

            if(abs(cell/rmsVoltage) >= (thresholdVolts/rmsVoltage)){
                cache.insert(std::distance(row.begin(), colnItr));
                index.push_back(std::distance(row.begin(), colnItr));
            }

        }

        if(cache.size() == 0) count == 0;

        if(cache.size() == 3){

            ++found;
            cache.clear();

            if(std::distance(rowItr, output.end()) > ((4000 - count) + 4E+6)){
                std::advance(rowItr, ((4000 - count) + 4E+6));
            }

        }


    }

}

4

1 に答える 1