2016-12-13 19 views
-2

ベクトルから平均を効率的に計算しようとしています。私はの平均値を算出しています物事の種類(10,000異なる:私は(250)ベクトル値を効率的に追加および削除する方法C++

コラムバックつもりです日:

行: 私は(ベクトルのベクトル)行列を持っています)

現在、私は.push_back()を使用しています。これは本質的に各列の各行を繰り返し実行してから、最後の値を削除するためにerase()を使用します。このメソッドはすべての値を通過するので、私のコードは非常に遅いです。

私は置換にリンクされたメソッドを考えていますが、すべての値に順序が付いています(つまり、古い値を削除する必要があり、最新)。

これまでのコードは以下のとおりです。 正しい方向性のための解決策やガイドのアイデアは非常に高く評価されます。

//declaration 
vector <vector<float> > vectorOne; 
//initialization 
vectorOne(250, vector<float>(10000, 0)), 

//This is the slow method 
vectorOne[column].push_back(1);//add newest value 
vectorOne[column].erase(vectorOne[column].begin() + 0); //remove latest value 
+2

あなたは['deque'](http://en.cppreference.com/w/cpp/container/deque)のように聞こえます。 – molbdnilo

+0

これは本当に不明です - 固定幅スライディングウィンドウ用の循環バッファを実装しようとしていますか? – Useless

+1

これがあなたの実際のコードに近いなら、もちろんそれは本当に遅くなるでしょう。 'vectorOne(250、vector (10000,0)) 'は、すでに構築され、0に設定された250x10000要素のベクトルを構築します。' push_back'を使うと501st要素を追加します。その後、 'vectorOne [column] .erase(vectorOne [column] .begin()+ 0);'はデフォルトの0である最初の列を消去するので、前方9999個の要素をシャッフルする必要があります。なぜあなたは要素を消していますか?また、 'vectorOne [10] [25] = someval;'のように、 '[]'を使ってベクトルにアクセスして格納するだけでよいでしょう。 – NathanOliver

答えて

1

おそらく別のデータ構造が必要です。

問題はキューのように聞こえます。あなたは最後に追加し、正面から取る。実際の待ち行列では、誰もが一歩一歩踏み出します。コンピュータのキューでは、循環バッファを使用できます(最大キュー長で適切な境界を取得できる必要があります)。

最初にプレーンなC配列の上に自分自身を実装し、その原則を理解したらSTL版を使うことをお勧めします。

0

データのサイズを事前に知っている場合は、std::arrayを使用して再割り当てを取り除くことができます。 (std::arrayを導入しているC++ 11を使用していない場合は、これを使用することができます。これを覚えておいてください。

コードは(?...別の2次元アレイに)形式

std::array<std::array<yourdata,10000>250> rollingBuffer; 
or 
yourdata[250][10000] rollingBuffer; 

for(int i = 0; i < CycleLimit; i++){ 
    for(auto row : rollingBuffer){ 
    for(size_t col = 0; col < row.size(); col++) { 
     row[col] = getNextData(col); 
     double av; 
     for(const auto& r : rollingBuffer){ 
     av += r[col]; 
     } 
     sendAverage(av/yourData.size()); 
    } 
    } 
} 

、それは行を横切って進み、ある要素に新しいデータを入力し、その列の要素を合計し、それを記録し、それらはに移動次の列。行の終わりに達すると、次の行で再び開始されます。それが行の終わりに達すると、必要なだけ多くの反復処理が繰り返されるまで再び開始されます。

しかし、それは4つのネストループです。多分もっと良い方法があります...しかし、再割り当てはありません。 vectordequeと比較すると面白いでしょうか。

関連する問題