ゴール
以下のコードはvector<vector<float> >
、ガウス分布から乱数を取り込み、次のことを実行するように設計されています。
n
あるしきい値を超えるような最初の値に遭遇するまで、ベクトルのすべての列を同時に反復します。a) その値が最初に見つかった値とは異なる列から取得されるように、そのしきい値を超える 2 番目の値に遭遇するか、b) 反復の最大数を超えるまで反復を続けます。
a) の場合、c) 値が最初に見つかった値と2 番目に見つかった値とは異なる列から取得されるように、しきい値を超える 3 番目の値を見つけるか、b) の最大数を超えるまで反復を続けます。最初に見つかった値からの反復。b) の場合、最初からやり直しますが、今回は最初に見つかった値の 1 行後に反復を開始します。
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));
}
}
}
}