crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Полезные задачи, упражнения, тесты по ..., делимся интересными задачами по программированию и не только
Kagami
  опции профиля:
сообщение 19.10.2010, 18:41
Сообщение #11


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Не надо изобретать велосипед. Все это уже давно изучается в статистике и называется "выбросами". Сходу нашел вот такую тему.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 19.10.2010, 18:51
Сообщение #12


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Kagami,
не понял при чем тут
Цитата(Kagami @ 19.10.2010, 19:41) *
Не надо изобретать велосипед.


по приведенной ссылке кода на Си или С++ не обнаружил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.10.2010, 19:14
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Kagami @ 19.10.2010, 19:41) *
Не надо изобретать велосипед. Все это уже давно изучается в статистике и называется "выбросами". Сходу нашел вот такую тему.

Так в том-то и дело, что теория мне известна. Знаю, что есть такое в статистике. Если бы был приведен формализованный алгоритм (даже если словесный), то вот это было бы здорово.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 19.10.2010, 19:21
Сообщение #14


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(kwisp @ 19.10.2010, 19:48) *
в массиве значений(пусть double) необходимо удалить значений резко(более чем на 2-3 порядка) отличающиеся от соседних.

Если кому интересно предлагайте варианты.

хочется сразу спросить: а в чём подвох ? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 19.10.2010, 19:27
Сообщение #15


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Алексей1153 @ 19.10.2010, 20:21) *
хочется сразу спросить: а в чём подвох ?

ни в чём. кому интересно пишет варианты.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 19.10.2010, 19:44
Сообщение #16


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Раскрывающийся текст
std::vector<double> vec;

//заполняем vec
{
    vec.push_back(0);//для удобства вычислений в дальнейшем

    //затем данные, k значений
    //...

    vec.push_back(0);//для удобства вычислений в дальнейшем

    //в начало и конец кладём болванки,
    if(vec.size()>1)
    {
        vec[0]=vec[1];
        vec[vec.size()-1]=vec[vec.size()-2];
    }

    //теперь вектор содкржит данные, окружённые болванками:
    //
    //N0 (N0 N1 N2 N3 ... Nk-3 Nk-2 Nk-1) Nk-1
}

//набор флагов (для простоты пока один флаг - один байт.
//Но можно будет разместить 8 флагов в байте, уменьшив размер вспомогательного вектора)
std::vector<BYTE> flg(vec.size(),0);

double __acc=1000;
double n_acc=1/__acc;

if(vec.size() && flg.size())
{
    DWORD dwdMax=min(vec.size(),flg.size())-1;
    double k=0;

    for(DWORD dwd=1;dwd<dwdMax;dwd++)
    {
        k=vec[dwd-1]/vec[dwd];
        if(k<0)k=-k;

        if(k>__acc || k<n_acc)
        {
            flg[dwd]=1;
        }
        else
        {
            k=vec[dwd]/vec[dwd+1];
            if(k<0)k=-k;

            if(k>__acc || k<n_acc)
            {
                flg[dwd]=1;
            }
        }
    }

    //flg[1 ... size()-2] содержит флаги элементов, которые надо удалить
}



случай переполнения я не рассматривал

можно также обойтись и без вектора флагов.

А ещё, бы просто заменял нехорошие скачки средним значением от соседних элементов, не удаляя сам элемент

Сообщение отредактировал Алексей1153 - 19.10.2010, 20:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.10.2010, 19:48
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Что за болванки? А можно все-таки кроссплатформенные типы использовать? :) А за вариант спасибо. Правда, не все понятно. Но разобраться можно. Спасибо. Да - если, все же, прокомментируешь свой алгоритм словесно, то буду очень благодарен.

Вот это действие удивило:
  vec[vec.size()-1]=vec[vec.size()-1];


Сообщение отредактировал AD - 19.10.2010, 19:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 19.10.2010, 20:20
Сообщение #18


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


AD, я исправил - там size()-2

Цитата(AD @ 19.10.2010, 22:48) *
А можно все-таки кроссплатформенные типы использовать?

DWORD и BYTE то ? ) Замени по вкусу (32 и 8-битные)

под болванками имею в виду расширение вектора данных на 1 элемент вправо и влево (добавляю конечные же значения)
это для удобства - не надо будет проверять на выход за край

проверку на переполнение сделать - это отдельная интересная задача :) Дело в том, что сделать вот так не очень хорошо - скажется на скорости
for(DWORD dwd=1; dwd<dwdMax; dwd++)
{
  try
  {
       k=a/b;
  }
  catch(...)
  {
      k=бесконечности;
  }
}

я уже придумал, как можно оптимизировать, будем считать это очередной задачей :)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 20.10.2010, 8:56
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Так. Разобрал код. Есть вопросы.
1) Я правильно понимаю, что __acc, n_acc - пределы, по которым определяются "шумы"?
2) Сильно ли усложнит задачку следующее добавление, что пределы должны определяться в зависимости от массива/вектора?
Ну то есть для следующей последовательности (0.1, 0.15, 0.13, -0.11, 0.21, 17, -0.37654, -0.321, 0.75, -1.1, 0.54, -0.33334, -13.56, 1.45, -1.96) -13.56 и 17 являются шумами! Понятно, что какой-то предел пользователь обязан задавать, но есть ли возможность как-то его настраивать?

Сообщение отредактировал AD - 20.10.2010, 9:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 20.10.2010, 8:58
Сообщение #20


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Видно что задача требует уточнения.
Нужно удалить из интервала значения которые не вписываются в общую картину на 2-3 порядка как в большую так и в меньшую сторону.

Вопрос к Алексей1153 : Как поведет себя предложенный метод если к примеру первые 2 значения числа больше 1000 и 2000, а остальные 1 2 3 4 5. - какие значения удалятся из интервала?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 6:13