2010-07-02 2 views
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; 
} 

Моего это проблемы качества: Является ли это доступным для копирования гистограммы в дополнительном векторе первый, так что, когда Я сглаживаю в бункере i Я могу использовать исходное значение i-1 или просто сделать smoothedValue += (*histogram)[bin-1+i]*mask[i];, так что я использую уже сглаженное значение i-1 вместо исходного.

С уважением & Благодарим за ответ.

+0

Добро пожаловать в SO! В следующий раз, пожалуйста, отформатируйте свой код, отложив его четырьмя пробелами или выбрав его и нажав кнопку 101010. На этот раз я сделал это для вас. Вы можете использовать backticks (\ '\') для форматирования кода внутри абзацев текста. – Thomas

ответ

2

Ваша интуиция правильная: вам нужен временный вектор. В противном случае вы будете использовать частично старые значения и отчасти новые значения, и результат будет неправильным. Попробуйте сами на бумаге с простым примером.

Есть два способа вы можете написать этот алгоритм:

  1. Копирование данных во временный вектор первого; затем прочитайте с этого и напишите до histogram. Это то, что вы сделали в своем первом фрагменте кода.
  2. Читайте с histogram и напишите во временный вектор; затем скопируйте с временного вектора обратно на histogram.

Для предотвращения ненужного копирования данных вы можете использовать vector::swap. Это чрезвычайно быстрая операция, которая меняет содержимое двух векторов. Используя стратегию 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); 
Смежные вопросы