Среднее значение
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Среднее значение
Блоки созданы на основе https://flprog.ru/downloads/usersblocks ... znachenie/
Простое скользящее среднее (Simple Moving Average)
Взвешенное скользящее среднее (Weighted Moving Average)
Блок работает следующим образом:
По переднему фронту считывается значение со входа input. Буфер значений сдвигается от последнего к первому. И полученное значение заносится в последнюю ячейку.
При накоплении в буфере количества значений заданных в Параметрах пользователя вычисляется среднее этих значений.
Отличие этих блоков от исходного в том, что среднее высчитывается каждый раз, при поступлении нового значения.
В этой теме есть блок "скользящее среднее на 8 значений". В этих же блоках можно задавать свои параметры, сколько значений использовать для усреднения.
Чем отличается Простое скользящее среднее от Взвешенное скользящее среднее: При простом среднем все значения одинаково влияют на результат. При взвешенном среднем последнее значение влияет на результат больше, предыдущие чуть меньше и самое первое меньше всех.
Простое скользящее среднее (Simple Moving Average)
Взвешенное скользящее среднее (Weighted Moving Average)
Блок работает следующим образом:
По переднему фронту считывается значение со входа input. Буфер значений сдвигается от последнего к первому. И полученное значение заносится в последнюю ячейку.
При накоплении в буфере количества значений заданных в Параметрах пользователя вычисляется среднее этих значений.
Отличие этих блоков от исходного в том, что среднее высчитывается каждый раз, при поступлении нового значения.
В этой теме есть блок "скользящее среднее на 8 значений". В этих же блоках можно задавать свои параметры, сколько значений использовать для усреднения.
Чем отличается Простое скользящее среднее от Взвешенное скользящее среднее: При простом среднем все значения одинаково влияют на результат. При взвешенном среднем последнее значение влияет на результат больше, предыдущие чуть меньше и самое первое меньше всех.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Среднее значение
[ref]edyapd[/ref], Вопрос по блоку "Простое скользящее среднее (Simple Moving Average)"- зачем всегда писать в последнюю ячейку и постоянно двигать массив, да ещё флоатовский?
У Вас есть указатель, index, пользуйтесь им, вносите в массив по кольцу.
Но, кстати, сакральный смысл его в Вашем блоке, и вот эта строка:
if ( index < (Количество замеров - 1 ) ) { index++; return; }
мне совсем не понятен, т.е. абсолютно.
У Вас есть указатель, index, пользуйтесь им, вносите в массив по кольцу.
Но, кстати, сакральный смысл его в Вашем блоке, и вот эта строка:
if ( index < (Количество замеров - 1 ) ) { index++; return; }
мне совсем не понятен, т.е. абсолютно.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Среднее значение
[ref=#ff8000]Sancho[/ref], дело в том, что я не знаю С от слова совсем. Я могу как попугай повторить то, что уже кем-то написано. Могу чуток подправить. Но пока с трудом могу представить, как двигать индекс по кольцу, да ещё не запутаться в этом. Да и старался два блока делать по одной технологии. А в WMA, при движении индекса, возникли бы сложности с весом значений.
В этой строке дожидаюсь, когда весь массив заполнится, прежде чем выводить среднее. Иначе это будет среднее непонятно от чего.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Среднее значение
Подобие - не всегда хорошо, особенно с необоснованными, абсолютно лишними, манипуляциями.
Да ещё и с float.
Или хотя-бы "насквозь":
if ( index < (Количество замеров - 1 ) ) { output = value; index++; return; }
Да ещё и с float.
Но, по Вашему, у меня до заполнения будет на выходе блока ноль, а это тоже значение, и возможно очень далёкое от замеров. Пример: на входе значения в районе 1000, замеров 10. В данном раскладе 9 замеров 0, потом 1000. А при удалении данной строки: 100, 200, 300 и т.д. - хотя-бы не скачкообразно. Тем более, не известно как будут использоваться результаты.edyapd писал(а): 15 ноя 2019, 12:05 В этой строке дожидаюсь, когда весь массив заполнится, прежде чем выводить среднее. Иначе это будет среднее непонятно от чего.
Или хотя-бы "насквозь":
if ( index < (Количество замеров - 1 ) ) { output = value; index++; return; }
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Среднее значение
[ref=#ff8000]Sancho[/ref], Тут можно долго спорить, как и когда правильно выводить результат.
Я почему взялся за эти блоки вообще. Поставил датчик BME280 и мне не понравилось, что на выходе резкие скачки. Особенно влажность и давление. Нашёл блок среднее на сайте. Поставил, стало лучше, но в том блоке хоть вход и выход обозначены как float, внутренние переменные int. И это давало погрешность. Вот и взялся переделать под себя. Выложил, подумав, что может ещё кому будет интересно.
Лет пять назад, я писал роботов (чисто для себя) для торговли на бирже. Так вот там среднее начиналось выдаваться, только после того, как было получено не меньше значений, чем было указано. Взял чисто по аналогии.
Я почему взялся за эти блоки вообще. Поставил датчик BME280 и мне не понравилось, что на выходе резкие скачки. Особенно влажность и давление. Нашёл блок среднее на сайте. Поставил, стало лучше, но в том блоке хоть вход и выход обозначены как float, внутренние переменные int. И это давало погрешность. Вот и взялся переделать под себя. Выложил, подумав, что может ещё кому будет интересно.
Лет пять назад, я писал роботов (чисто для себя) для торговли на бирже. Так вот там среднее начиналось выдаваться, только после того, как было получено не меньше значений, чем было указано. Взял чисто по аналогии.
Float мне нужен был для десятых температуры. Если кому-то не нужен float то из переделок там только заменить все float на int
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Среднее значение
речь была об этом:Sancho писал(а): 15 ноя 2019, 12:31 Подобие - не всегда хорошо, особенно с необоснованными, абсолютно лишними, манипуляциями.
Да ещё и с float.
edyapd писал(а): 15 ноя 2019, 12:05 Но пока с трудом могу представить, как двигать индекс по кольцу, да ещё не запутаться в этом. Да и старался два блока делать по одной технологии. А в WMA, при движении индекса, возникли бы сложности с весом значений.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Среднее значение
[ref=#ff8000]Sancho[/ref], вы хорошо знакомы с С. Можете мне сказать, сколько времени займёт перенос значения float из одной ячейки массива в другую. Я вполне согласен с вами, что контроллер, который не предназначен для вычисления с плавающей запятой будет долго их обсчитывать, но копирование четырёх байт разве может занять так уж много времени?
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Среднее значение
[ref]edyapd[/ref], При 10 размерах - 40. Вопрос в другом - зачем?
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Среднее значение
Прошу прощения, не понял.
Ну так я же уже объяснил, что не знаю С. Мне проще доработать то, что уже работает.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Среднее значение
Код: Выделить всё
for(int i = 1; i < Количество замеров ; i++ ) { array[i - 1] = array[i]; }
Вопрос снят.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Среднее значение
Дошло. Просто я спрашивал про то, сколько это займёт по времени или по тактам. То есть, сколько можно сэкономить если пустить индекс по кругу.
Если честно, то когда то мог сам легко посчитать, сколько тактов займёт подпрограмма, но эти времена были очень давно, когда я писал на Ассемблере.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя