Как алгоритмизировать выявление скопления фида МА? - страница 6

 

Рассчитать медиану цены на заданном интервале с заданным количеством приближений.

Здравствуйте есть массив значений.

Задача написать функцию.

Параметры входа:

- массив содержит номера нужных элементов  для расчета медианы - bufInBar[] 

- размер массива bufInBar[]  - count

- Количество приближений в медиан - fokus

void medianaL0(const int &bufInBar[], int count, int fokus)

То есть есть класс 

bufInBar[i] - используется для загрузки нужного элемента при расчете медианы 

BP[bufInBar[i]].CenaPerioda; - по этому значению рассчитывается медиана
BP[bufInBar[i]].Period; 

На выходе :

BP[bufInBar[i]].Mediana; 

Заполняется в порядке возрастания например с 0 до 10.

То есть,  если в условии  fokus=10, то на интервале i<count десять значений 

BP[bufInBar[i]].Mediana;

будут равны от 1 до 10

Например

BP[3256].Mediana=0;
BP[6256].Mediana=1;
BP[9256].Mediana=2;
...
 
Непонятно, что за  fokus
 
По идее, медиана - это значение элемента в середине упорядоченного массива. А в Вашем случае это что?
 
Dmitry Fedoseev:
Непонятно, что за  fokus
Aleksei Stepanenko:
По идее, медиана - это значение элемента в середине упорядоченного массива. А в Вашем случае это что?

Пример:

Массив 30 значений цены МА, ищем середину упорядоченного массива.

Получаем 15(L0) значение середины массива,далее получаем два массива от L0 вниз и L0 наверх, находим середину этих массивов и так до получения количества fokus(семи значений например)

                        --------------|--------------
                        -------|--------------|------
                        ---|-------|------|-------|--
fokus=7
| - значение цены
        

 
Mikhail Toptunov:

Пример:

Массив 30 значений цены МА, ищем середину упорядоченного массива.

Получаем 15(L0) значение середины массива,далее получаем два массива от L0 вниз и L0 наверх, находим середину этих массивов и так до получения количества fokus(семи значений например)

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

 
Mikhail Toptunov:

Пример:

Я правильно понимаю, что нужно найти семь перцентилей: 12.5, 25, 37.5, 50, 62.5, 75, 87.5?

Если да, то делим количество элементов упорядоченного массива на 8 (7+1), и умножаем на номер нужного перцентиля. Получаем следующие индексы элементов: 3, 7, 11, 15, 18, 22, 26.  

int index=ArraySize(bufInBar)*percentile/(fokus+1);

//где percentile - номер нужного перцентиля от 1 до fokus 

double value=bufInBar[index];

Так, или я не туда пошёл? Если так, то здесь самое важное создать экономный механизм ведения упорядоченного массива.

 
Почему нельзя использовать MathQuantile()?
 
Dmitry Fedoseev:

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

Думаю легче брать целое четное значение.

если 15 элементов, то медиана 8.

 
Aleksei Stepanenko:

Я правильно понимаю, что нужно найти семь перцентилей: 12.5, 25, 37.5, 50, 62.5, 75, 87.5?

Если да, то делим количество элементов упорядоченного массива на 8 (7+1), и умножаем на номер нужного перцентиля. Получаем следующие индексы элементов: 3, 7, 11, 15, 18, 22, 26.  

Так, или я не туда пошёл? Если так, то здесь самое важное создать экономный механизм ведения упорядоченного массива.

По массиву значений MA нужно найти медиану всего массива, далее медианы массивов полученных над/под первой медианой и т.д.

 

Тогда вроде всё правильно, медиана первой части массива - это четверть общего массива, и это 25 перцентиль. А медиана второй части - 75 перцентиль.

Это:

                        --------------|---------------
                        -------|--------------|-------
                        ---|-------|------|-------|---

равнозначно этому:

                        ---|---|---|---|---|---|---|---