0

私は次の状況を で解決しましたvectorが、年配の同僚の 1 人が議論の中で、配列を使用するとはるかに高速になると言っていました。

大量のオーディオ ファイルから 12 次元のベクトルを大量に (つまり、大量に!) 計算し、それらを処理のために保存する必要があります。計算を開始する前に、これらすべてのベクトルが本当に必要です。とにかく、オーディオがいくつあるかは予測できませんし、各オーディオから抽出されるベクトルの数も予測できません。そのため、ベクトルを動的に保持する構造が必要です。

そのため、各ベクトルに対して新しい double 配列を作成し、それをvector.

私の同僚が本当に正しければ、保存用のベクトルの代わりに配列を使用して計算を強化できるかどうか、直面してテストしたいと思います。

vector<double*>* Features = new vector<double*>();
double* feature = new double[12];
// adding elements
Features->push_back(features);

動的に 2 次元配列を作成するには、行数を知る必要があります。

double* container = new double*[rows];
container[0] = new double[12];
// and so on..

すべてのオーディオを処理した後の行はわかっていますが、オーディオを 2 回処理したくありません。

これを解決して追加する方法について誰もが考えましたか、それともその方法では不可能なので、vector独自の構造を使用するか作成する必要があります(ベクトルよりも遅いと想定されます)。

4

3 に答える 3

4

そうしない強い理由がない限り、私は次のようなことを提案します:

std::vector<std::array<double, 12>> Features;

必要なすべてのメモリ ローカリティと、必要なすべての自動メモリ管理を取得できます。

于 2012-09-07T06:30:47.757 に答える
2

あなたは確かにこれを行うことができますが、これをで実行するとはるかに良いでしょうstd::vector。2Dアレイを動的に拡張するには、これらすべてのことを実行する必要があります。

  • 一時的な2D配列を作成します
  • それにメモリを割り当てます。
  • 各コンポーネント配列にメモリを割り当てます。
  • データをそのコンポーネント配列にコピーします。
  • 元の2Dアレイの各コンポーネントアレイを削除します。
  • 2Dアレイを削除します。
  • 新しい入力を取ります。
  • 一時的な2D配列に新しいアイテムを追加します。
  • 元の2D配列を作成し、それにメモリを割り当てます。
  • コンポーネント配列にメモリを割り当てます。
  • 一時データを再度コピーします。

各ステップでこれを行った後、アレイがこれ以上高速になることはほとんど受け入れられません。を使用しstd:vectorます。上記の書面による回答はそれを説明しています。

于 2012-09-07T06:34:20.253 に答える
0

ベクトルを使用すると、データが自動的に成長するため、問題が簡単になります。残念ながら、ベクトルが大きくなる方法が原因で、ベクトルを使用することは最善の解決策ではない場合があります。これは、大きなデータ セットを大きくするには何度も必要になるためです。一方、ベクトルの初期サイズを非常に大きく設定しても、少数の 12 個のインデックス配列のみが必要な場合。大量のメモリを無駄にしました。必要なサイズを推定する方法がある場合は、その推定値を使用して配列を動的に割り当てるか、ベクトルを最初にそのサイズに設定することができます。

データを 1 回か 2 回だけ計算する場合は、マップまたはリストの使用を検討する必要があります。これら 2 つの大規模な配列の構造は、正確なニーズに一致するメモリ構造を作成し、配列を拡大するための余分な時間要件を回避します。一方、これらのデータ構造を使用した計算は遅くなります。

これらの考えが、この議論にいくつかの代替ソリューションを追加することを願っています。

于 2013-04-25T19:56:28.903 に答える