2

おそらく非常に簡単な質問がありますが、まだわかりません!

実際には、ヒストグラムを滑らかにしたいだけで、次の方法のどれが正しいかわかりません。私はこのようにしますか:

vector<double> mask(3);
mask[0] = 0.25; mask[1] = 0.5; mask[2] = 0.25;

vector<double> tmpVect(histogram->size());
for (unsigned int i = 0; i < histogram->size(); i++)
  tmpVect[i] = (*histogram)[i];

for (int bin = 1; bin < histogram->size()-1; bin++) {
  double smoothedValue = 0;
  for (int i = 0; i < mask.size(); i++) {
    smoothedValue += tmpVect[bin-1+i]*mask[i];
  }
  (*histogram)[bin] = smoothedValue;
}

または、通常は次のようにしますか?:

vector<double> mask(3);
mask[0] = 0.25; mask[1] = 0.5; mask[2] = 0.25;

for (int bin = 1; bin < histogram->size()-1; bin++) {
  double smoothedValue = 0;
  for (int i = 0; i < mask.size(); i++) {
    smoothedValue += (*histogram)[bin-1+i]*mask[i];
  }
  (*histogram)[bin] = smoothedValue;
}

私のQuestinは次のとおりです。最初にヒストグラムを追加のベクトルにコピーして、ビンで平滑化するときにi元の値を使用できるようにするi-1か、元の値の代わりにsmoothedValue += (*histogram)[bin-1+i]*mask[i];すでに平滑化された値を使用するか.i-1

よろしく&お返事ありがとうございます。

4

1 に答える 1

3

あなたの直感は正しいです。一時的なベクトルが必要です。そうしないと、部分的に古い値を使用し、部分的に新しい値を使用することになり、結果が正しくなくなります。簡単な例を使って紙の上で試してみてください。

このアルゴリズムを作成するには、次の 2 つの方法があります。

  1. 最初に一時的なベクターにデータをコピーします。次に、そこから読み取り、に書き込みhistogramます。これは、最初のコード フラグメントで行ったことです。
  2. histogram一時的なベクターの読み取りと書き込み。次に、一時ベクトルからコピーして に戻しhistogramます。

データの不必要なコピーを防ぐために、 を使用できますvector::swap。これは、2 つのベクトルの内容を交換する非常に高速な操作です。上記の戦略 2 を使用すると、次のようになります。

vector<double> mask(3);
mask[0] = 0.25; mask[1] = 0.5; mask[2] = 0.25;

vector<double> newHistogram(histogram->size());

for (int bin = 1; bin < histogram->size()-1; bin++) {
  double smoothedValue = 0;
  for (int i = 0; i < mask.size(); i++) {
    smoothedValue += (*histogram)[bin-1+i]*mask[i];
  }
  newHistogram[bin] = smoothedValue;
}

histogram->swap(newHistogram);
于 2010-07-02T11:14:49.383 に答える