|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
16.07.2015, 16:00 | #11 |
Регистрация: 31.01.2011
Сообщений: 7
|
у меня есть 50000 значений, которые фактически представляют собой SIN, но синус кривой, т.е. выполнена кривая не плавно, а ступеньками.
В каждой ступеньке по 33 или 34 значения. Соответственно мне надо отловить первую ступень, потом делать проверку на 33 или 34. Пока думал основной алгоритм, забыл про переполнение, сейчас смотрю. А вот то, что я писал про список и контейнер. можете посоветовать какое чтиво в контексте поставленной задачи, а не просто вообще теория. А то котелок уже свистит и раскраснелся. |
16.07.2015, 16:08 | #12 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Ну в целом то контейнерами называют любой механизм обработки списка.
vector, list, stack... Даже обычный список, который дают в ВУЗах тоже можно назвать контейнером. Т.е. контейнер, это некий обьект, в который можно засунуть какие-то данные не обязательно сходные по типу, например положить туда строку и число, так, что они будут как бы элементами списка. Ну а чтива про списки можешь поискать. Можно про коллекции почитать: https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx
I'm learning to live...
|
16.07.2015, 16:17 | #13 |
Регистрация: 31.01.2011
Сообщений: 7
|
Что-то текст сообщения не передался.
Короче говоря я читаю массив [50000,2] из файла, представляющий собой 2 кривые, одна изменяется плавно, другая ступеньками. Я работаю над той которая ступеньками соответственно. 33 и 34 это кол-о тактов на одну ступеньку(идёт 33 33 34 33 33 34 и т.д. но опять же не до конца уверен, что такое соотношение на всём промежутке). 1.5 - я подобрал исключительно из наблюдений за 2 соседними ступеньками. изменение между ними превышает любое изменение в ступеньке в 1.5 раза(и я надеюсь, так и будет оставаться) начинается кривая не с полноценной ступеньки, поэтому вначале ищу самую большую дельту за 34 такта. Её номер и делаю стартовым для основной функции. вот так. Если существует лучшее решение подобной проблемы, прошу подскажите. И соответственно где про можно о нём почитать, в котексте моей проблемы Ахаа терь отправилось триндец, видать мозила коньки отбрасывает. |
17.07.2015, 08:27 | #14 | |
Форумчанин
Регистрация: 27.01.2014
Сообщений: 115
|
Цитата:
Зачем такие сложности? У вас синус, если речь идет о нем, представляется функцией Asin(x + fi) + b. Сам синус имеет два экстремума. В общем случае дискретизация может захватить экстремум или нет. Тогда вы получите три точки если она захватила экстремум (- 0 + или + 0 -) и не захватывает (- + и + -), минусы и плюсы - это поведение производной, а в алгоритме такую проверку можно сделать просто. Если каждое следующее значение возрастает, мы приближаемся к верхнему экстремуму, как только встретили значение которое не возрастает - мы перешагнули этот экстремум. Аналогично и про нижний экстремум. В итоге вы таким образом можете проверить гипотезу, что ваш синус описывается 33 или 34 тактами. Опять же, получив информацию о том, где находится первый экстремум, вы получаете информацию о фазовом сдвиге синуса и сможете правильно разбить данную дискретизацию на блоки. А на счет предположения что, изменение между двух ступенек кратно 1,5 на мой взгляд спорно. Если у вас A сравнительно небольшое (небольшая амплитуда), тогда приближаясь к экстремуму, ваши 1,5 начнут уменьшаться вплоть до нуля. Или я не правильно вас понял |
|
17.07.2015, 09:28 | #15 |
Регистрация: 31.01.2011
Сообщений: 7
|
Как я понимаю в своём сообщении вы предполагаете что функция монотонно возрастает и убывает. Это немного не так. На каждую ступеньку приходится 33-34 значения и они имеют произвольное значение для этой ступени.
Насчёт полтора с вами полностью согласен, но не вижу варианта лучше. Кроме того 1.5 я выбрал для самой маленькой амплитуды, и оставлю это знач для больших. |
17.07.2015, 09:51 | #16 | |
Форумчанин
Регистрация: 27.01.2014
Сообщений: 115
|
Цитата:
|
|
17.07.2015, 09:59 | #17 |
Регистрация: 31.01.2011
Сообщений: 7
|
угу.
Сейчас наконец нашёл ошибку, получился син, но ведётся относительно монотонно растущей прямой. Всё убрал))))) Всё арбайтает. Проблема была в переполнении индекса относительно количества значений матрицы. Моя первая прожка получается) а росло из-за необнуления среднего после каждого цикла 33 значений |
17.07.2015, 10:24 | #18 | |
Форумчанин
Регистрация: 27.01.2014
Сообщений: 115
|
Цитата:
Но я бы на вашем месте никаких констант не заводил бы, а воспользовался бегущими средними для выяснения поведения функции для последующей обработки. Первая была бы по двум значениям - хотя бы как-то сгладила шумы, т.е. они бы частично схлопнулись (типа идеальное значение где-то по середине между двух зашумленных). Вторая была бы, например, по 5 последним - она бы очень сильно сгладила сигнал и по ней можно делать контрольную проверку, если вдруг имеются какие-то скачки. Это в том случае, если вы хотите отвязаться от константы цикла значений и обработать, например сигнал, который на период функции имеет 330 значений (т.е. в 10 раз больше чем у вас) без переписывания кода. ИМХО, получается "Угадай мелодию", для каждого нового сигнала вам нужно угадать сколько значений на период получается, чтобы его обработать. |
|
17.07.2015, 10:35 | #19 |
Регистрация: 31.01.2011
Сообщений: 7
|
Идею понял. но для моего варианта для всех 40 вариантов получается 33-34 значения на уровень и меняться не будет.
Бегущее среднее = Aср(n-1) + (Acр(n)-Aср(n-k))/k мы его зовём скользящее среднее)) |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
работа с функциями в C# | Анастасия666 | C# (си шарп) | 3 | 16.11.2013 18:48 |
Работа с функциями !) | vladtum | Общие вопросы C/C++ | 0 | 28.11.2010 17:25 |
Работа с функциями(С++) | Scarletred | Помощь студентам | 5 | 06.04.2010 13:29 |
РАБОТА С ФУНКЦИЯМИ В С++ | серг | Помощь студентам | 4 | 03.03.2010 22:26 |