2013-03-15 6 views
2

У меня есть массив double * с примерно 10 000 элементами и вам нужно вычесть среднее значение из него. И это нужно сделать, бросить много.Среднее значение вычитания C++ из массива double

Прямо сейчас я сделал это бросить глупо:

double mt = 0; 
for (int i=0; i<n; i++) {mt += array[i];} 
mt /= n; 
for (int i=0; i<n; i++) {array[i] -= mt;} 

массив Причем: большой массив двойной & п является размер этого массива. Я уверен, что есть способ реализовать его с помощью некоторых причудливых персонажей, которые будут намного быстрее, и я надеюсь, что вы, парень, можете мне помочь.

веселит Magu

+0

Это будет довольно быстро. Вы пытались скомпилировать его с самой высокой настройкой оптимизации и бенчмаркингом? – NPE

+3

Быстрее? Parallelize ... – qPCR4vir

+0

Я не думаю, что есть лучший (лучше, чем быстрее) прямой способ сделать это на C++ по коду (возможно, с точки зрения процессора, если вы сделаете это параллельно на нескольких ядрах). Может быть, на ассемблере, но об этом нужно подумать. – Jcl

ответ

0

это можно сделать немного короче, но производительность не будет заметно лучше. Используйте std::accumulate из <algorithm>:

double mean = std::accumulate(array, array + n)/double(n); 

Что вы можете сделать, однако, помнить первый раз, когда вы вычислить его, а затем на последующих итерациях просто вычесть (mt * n) из суммы (при условии, что вы показываете в этом вопросе является модификацией, что происходит между итерациями

0

Ваше решение выглядит хорошо для меня.

Вы можете использовать std::transform, но я уверен, что это не сделает его более читаемым.

0

Если вам нужно сделать это очень часто, то почему бы не просто сохранить общее количество и количество элементов в массиве?

Тогда сумма для вычисления среднего будет иметь сложность O (1).

0

Вы можете пропустить вычисление среднего значения каждый раз, сохраняя активную копию total_value. Если вам приходится рекурсивно вычитать среднее значение из самой самой таблицы, вы можете использовать следующую формулу и найти общую формулу .

new_total = old_total - n * prev_mean; new_mean = new_total/n;

0

Хм кажется, что на низком уровне ничего не реализовано.

Спасибо в любом случае за ответы.

Смежные вопросы