Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7

Таймер и глобальные переменные

24.10.2016, 20:55. Показов 3492. Ответов 12

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Как не слишком опытный программист, обращаюсь за алгоритмической и идейной помощью, а также небольшой консультацией.

Мне необходимо вписывать в матрицу значения с частотой 1000 Гц. Я предварительно создаю матрицу (размером около 8 000 000 ячеек) и с помощью таймера заношу туда значения. Значения эти изменяются в процессе работы программы. В то же время таймер не ловит изменение значения (или я не знаю, как это сделать), которое нужно вписывать. Это можно сделать, только если задекларировать значения как глобальную переменную. А значит, нужно декларировать как глобальную и эту матрицу на восемь миллионов ячеек.

Я так почитал, глобальные переменные использовать - дурной тон. К тому же, они тормозят программу (а у меня, очень вероятно, данные не дают результатов именно из-за временного рассогласования). Но когда я попробовал передавать зту матрицу как переменную в функцию таймера - частота из 1000 Гц стала 0.1 Гц, если не меньше.

Не могли бы Вы подсказать, как наиболее оптимально решить задачу? Без потерь в скорости.

На всякий случай: Я через протокол lab streaming layer (lsl) записываю электрические сигналы с мышц, которые надо с минимальными потерями скоординировать с координатами на плоскости.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2016, 20:55
Ответы с готовыми решениями:

Глобальные переменные
В программировании надо заполнить несколько матриц-столбцов. При этом начальных значений у них нет, а размерность >500 так что вручную...

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

глобальные переменные
здравствуйте, я только начал изучать C++, в книге Штидта Г. есть такой код, он выводит: count + число, помогите понять принцип работы этого...

12
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
25.10.2016, 07:37
Вообще-то, Windows не является операционной системой (ОС) реального времени.
Вы в какой ОС работаете?
0
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
25.10.2016, 08:34  [ТС]
Ну вообще-то в Виндоусе, да... Но сам компьютер довольно мощный, 32 Гб, и не меньше четырех ядер (очень вероятно, что восемь). Небольшая рассинхронизация, по идее, не так страшна, я проверял на других данных. Главное, чтобы она не нарастала. Этого никак не избежать?
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
25.10.2016, 09:40
Цитата Сообщение от vidriera Посмотреть сообщение
сигналы с мышц, которые надо с минимальными потерями скоординировать с координатами на плоскости
Вы мастерите/моделируете нЕкую электро/механическую машину, управляемую эл сигналами мышц, которая должна работать с минимальными задержками?

Добавлено через 53 секунды
Цитата Сообщение от vidriera Посмотреть сообщение
помощью таймера заношу туда значения
Не понял, поясните

Добавлено через 1 минуту
Цитата Сообщение от vidriera Посмотреть сообщение
lab streaming layer (lsl)
А это что за зверь, в help я его не увидел
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
25.10.2016, 11:36
В MATLABe есть специальное направление, автоматизация испытаний и управления, и там используются специальные модули MATLAB и так называемые машины реального времени. К сожалению из-за финансового кризиса мы недоросли до этих возможностей, поэтому здесь у меня только теоретические познания.
Вообще если есть возможность, то желательно разделить процессы по времени, сначала собирать данные, а потом их обрабатывать.
Цитата Сообщение от vidriera Посмотреть сообщение
Я так почитал, глобальные переменные использовать - дурной тон.
Если это является практически единственным способом обмена данными между функциями в различных m-файлах и c модулями simulink, то как их не использовать.
Как-то я пытался протестировать как лучше передавать данные в функцию при решении системы диффуравнений - глобальными переменными или в виде параметров функции. В результате оказалось, что тестирование дает большой разброс по результатам, во время выполнения теста MATLAB живет своей жизнью (что-то опрашивает, что-то где-то сохраняет). В итоге разница между методами передачи данных получалась значительно меньше чем разброс результатов из-за деятельности MATLAB и Windows во время теста ( и это при наличии 12 потоков выполнения в системе ).
С этим разбросом возможно и Вы столкнетесь. Судя по описаниям работы функций таймера в MATLAB многопоточность не поддерживается (во всяком случае если смотреть что пишет Ануфриев Игорь Евгеньевич http://matlab.exponenta.ru/gui/book2/6.php
b Bob Davidov http://portalnp.ru/wp-content/... _Ed_21.pdf), автоматическое распараллеливание выполняется на матричных операциях.
Максимальная частота таймера в MATLAB ограничена 1000Гц (период 0.001с=1мс). (В частности в MS Visual C++ период таймера задается целым числом милисекунд - что наводит на мысль использования общего инструментария. В MS VC++ старт функции таймера происходит не потому, что точно прошел интервал времени равный периоду таймера, а потому что в момент опроса таймера текущее время больше чем время старта функции таймера. Поэтому возможны большие разбросы по моментам запуска функций таймера)
Цитата Сообщение от vidriera Посмотреть сообщение
когда я попробовал передавать зту матрицу как переменную в функцию таймера - частота из 1000 Гц стала 0.1 Гц
Конечно, при каждом обращении происходит коприрование массива.
0
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
25.10.2016, 14:35  [ТС]
Цитата Сообщение от Nick07 Посмотреть сообщение
Цитата Сообщение от vidriera
Сообщение от vidriera
сигналы с мышц, которые надо с минимальными потерями скоординировать с координатами на плоскости
Вы мастерите/моделируете нЕкую электро/механическую машину, управляемую эл сигналами мышц, которая должна работать с минимальными задержками?
Программа должна, в конечном итоге, считывать миограмму, фильтровать её с помощью фильтра Калмана, и в реальном времени преобразовывать миографические сигналы в координаты. На данном этапе нужно, чтобы она обучалась на статических данных для начала, то есть, создавала специальную трансформирующую матрицу, обрабатывая по определённой процедуре статические данные. Есть код с фильтром, который отлично работает с другими статическими данными. Но вот сейчас, когда я написал программу, которая будет записывать те же статические данные, их она, почему-то, не обрабатывает. Гипотеза - неправильная запись, вероятно - задержки.

Цитата Сообщение от Nick07 Посмотреть сообщение
Цитата Сообщение от vidriera
помощью таймера заношу туда значения
Не понял, поясните
Таймер работает постоянно. В процессе работы так же постоянно в MATLAB поступают координаты. Эти координаты записываются последовательно в предсозданную матрицу, заменяя нули. Каждую миллисекунду какой-то счётчик, скажем, k, прибавляет по единичке, таким образом смещаю строчку, в которую происходит запись. Поскольку при задании таймера он видит только то значение переменной, которое было при первичном объявлении, и сам по себе на изменения не реагирует, я вижу выход только в объявлении глобальной переменной и насильственном изменении её в процессе работы, как k, так и сигналов (которые в lsl тоже как бы переменная).

Цитата Сообщение от Nick07 Посмотреть сообщение
Цитата Сообщение от vidriera
lab streaming layer (lsl)
А это что за зверь, в help я его не увидел
Это внешний протокол, написанный энтузиастами, в стандартном MATLAB'е его нет. Насколько я знаю, он как-то через локальную сеть работает, помогает связать внешнее оборудование с компьютером и получать с него данные, чтобы те, кто в низкоуровневом программировании не разбирается, могли всё равно как-то что-то записывать

Цитата Сообщение от SSC
В MATLABe есть специальное направление, автоматизация испытаний и управления, и там используются специальные модули MATLAB и так называемые машины реального времени. К сожалению из-за финансового кризиса мы недоросли до этих возможностей, поэтому здесь у меня только теоретические познания.
Не очень понимаю про финансовые ограничения. В смысле, это какая-то платная дополнительная надстройка MATLAB'а? Как называется, не могли бы вы подсказать?

Цитата Сообщение от SSC
Вообще если есть возможность, то желательно разделить процессы по времени, сначала собирать данные, а потом их обрабатывать.
Ну, в принципе, так оно и будет происходить. Обработка, по крайней мере - на этом этапе - будет обрабатывать уже записанные данные. Просто задержка, по всей видимости, возникает как раз на этапе записи, а не обработки, из-за перезаписи огромной матрицы при подаче в функцию.

Цитата Сообщение от SSC
Если это является практически единственным способом обмена данными между функциями в различных m-файлах и c модулями simulink, то как их не использовать.
Вот в этом, собственно, и вопрос: единственнен ли этот способ? Или можно сделать что-то более умное? Что-то из ООП? Поскольку я никогда не писал ничего объектно-ориентированного, я не в курсе всех возможностей, которые это даёт. Мне вот сказали, что можно попробовать не перезаписывать матрицу, а сделать класс с ней как наследующий свойства от handle, и записывать через указатель. Но как это сделать...

Цитата Сообщение от SSC
и это при наличии 12 потоков выполнения в системе
Это вы как-то с помощью параллельной обработки запустили?

Цитата Сообщение от SSC
Судя по описаниям работы функций таймера в MATLAB многопоточность не поддерживается
Если я правильно понимаю то, что написано вот в этом ответе

https://www.mathworks.com/matl... -13-r2011b

то распараллеливание должно давать прирост в скорости... Но основная проблема у меня сейчас, наверное, всё-таки именно огромные переменные. Если с ними не удастся улучшить ситуацию, буду изучать запуск параллельной обработки.

Цитата Сообщение от SSC

старт функции таймера происходит не потому, что точно прошел интервал времени равный периоду таймера, а потому что в момент опроса таймера текущее время больше чем время старта функции таймера. Поэтому возможны большие разбросы по моментам запуска функций таймера
Но если это так - это же просто ужас... MATLAB же, по идее, используется для серьёзных научных целей. Как с таким бороться?
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
25.10.2016, 16:03
Цитата Сообщение от vidriera Посмотреть сообщение
Если я правильно понимаю то, что написано вот в этом ответе
Да, Вы привели правильную ссылку. И если у Вас (как и у меня) нет лицензии реализации парралельных вычислений, то запустить парраллельное вычисление не удастся и задача будет выполняться в 1 потоке.
Цитата Сообщение от vidriera Посмотреть сообщение
Это вы как-то с помощью параллельной обработки запустили?
Нет, в том то и дело, что распараллелить задачу в MATLABe я не могу (нет нужной лицензии). А в MS VC++ это не так уж и сложно.
Цитата Сообщение от vidriera Посмотреть сообщение
В смысле, это какая-то платная дополнительная надстройка MATLAB'а? Как называется, не могли бы вы подсказать?
Мы к сожалению не приобрели и не освоили это расширение (а было это года 3-4 назад поэтому мои знания несколько обрывочны). Посмотрите вот этот материал http://matlab.ru/rtm/

Цитата Сообщение от vidriera Посмотреть сообщение
Мне вот сказали, что можно попробовать не перезаписывать матрицу, а сделать класс с ней как наследующий свойства от handle, и записывать через указатель. Но как это сделать...
Посмотрите материал по ссылке, там есть обмен данными через handle
http://matlab.exponenta.ru/gui/book2/3.php#3

Цитата Сообщение от vidriera Посмотреть сообщение
Но если это так - это же просто ужас...
Это проблемы Windows, если честно я бы не взялся под Win писать обработку в реальном времени событий с частотой более 15 -20 Гц, это тот предел до которого под Win можно работать как на машине реального времени (ну с некоторыми погрешностями и с условием параллельной работы на потоках и оставлении как минимум одного свободного потока под задачи операционной системы).
Цитата Сообщение от vidriera Посмотреть сообщение
MATLAB же, по идее, используется для серьёзных научных целей. Как с таким бороться?
Как советовали представители MATLAB использовать их аппаратную приладу (плату) для обработки сигналов и их (или тружественный им) компьютер реального времени.
0
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
25.10.2016, 16:33  [ТС]
Цитата Сообщение от SSC Посмотреть сообщение
Цитата Сообщение от vidriera
Если я правильно понимаю то, что написано вот в этом ответе
Да, Вы привели правильную ссылку. И если у Вас (как и у меня) нет лицензии реализации парралельных вычислений, то запустить парраллельное вычисление не удастся и задача будет выполняться в 1 потоке.
То есть, если я в коммандной строке вбиваю parpool, и он запускается, то у меня всё есть, что надо? Потому что если так, то, вроде, так работает.

Цитата Сообщение от SSC Посмотреть сообщение
А в MS VC++ это не так уж и сложно.
Всё-таки, думаю, освоить целый язык программирования в сжатые сроки... Переписать на него всё, что уже есть... Уффф... Хотелось бы это отложить в более стратегические планы...
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
26.10.2016, 07:38
Цитата Сообщение от vidriera Посмотреть сообщение
То есть, если я в коммандной строке вбиваю parpool, и он запускается, то у меня всё есть, что надо?
Это я проверить не могу. Наличие лицензий на машине определяю командой ver из командной строки MATLAB (там должно появится что-то про Parallel.
0
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
28.10.2016, 10:06  [ТС]
Цитата Сообщение от SSC Посмотреть сообщение
Цитата Сообщение от vidriera
То есть, если я в коммандной строке вбиваю parpool, и он запускается, то у меня всё есть, что надо?
Это я проверить не могу. Наличие лицензий на машине определяю командой ver из командной строки MATLAB (там должно появится что-то про Parallel.
Понял. Спасибо. Полезная команда, не знал её. Похоже, лицензия на параллельную обработку есть. Спросил у старших, говорят, у них получалось делать с высокой частотой обработку в реальном времени на Windows - практически мой эксперимент, только с фильтром Винера. Наверное, это я кривой программист. Linux, как оказалось, ставить нельзя - политика учреждения. Поэтому придётся как-то выкарабкиваться...

Кроме того, попробовал создавать матрицу как объект handle. Разницы во времени, похоже, нет. Почитал на форумах

https://www.mathworks.com/matl... ead/311995

понял так, что MATLAB сам распознаёт, когда у матрицы большой размер и её становится быстрее обрабатывать через указатель, и оптимизирует это, вроде как, начинает сам обращаться к ней по указателю. Как вы думаете, правдоподобно? Или я опять что-то не так делаю?
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
28.10.2016, 12:34
Цитата Сообщение от vidriera Посмотреть сообщение
понял так, что MATLAB сам распознаёт, когда у матрицы большой размер и её становится быстрее обрабатывать через указатель, и оптимизирует это,
Это практически невероятно, слишком сложно и непонятно.
В функцию данные можно передать в качестве параметра или в качестве указателя (для С, С++, Паскаля, Fortrana).
При этом если данные передаются не указателем создается их копия в функции и их изменение в функции не приводит к изменению исходных данных. При передаче данных по указателю передается в функцию по сути адрес размещения данных и в функции можно не только прочитать, но и изменить исходные данные.
В MATLAB в функцию данные в качестве указателя через параметры не передаются (во всяком случае я не помню такой возможности). Однако когда в одном из модулей данные размещаются в handle, а другой модуль получает доступ к этим данным, мы по сути имеем передачу данных через указатель.
В MATLABе (в других языках то же самое) при работе с большими массивами данных рекомендуют сначала создать массив данных необходимого размера, а затем заполнять его и получать из него данные.
Проблема в том, что когда Вы запросите данные из массива из вне границ его определения, Вам будет возвращено сообщение об ошибке. Если Вы попытаетесь писать в элемент за границами определения массива, то MATLAB сначала узнает что размеров существующего массива не хватает, затем создаст в свободной памяти новый массив необходимого размера, затем скопирует туда данные из прежнего массива и освободит память из под прежнего массива, и наконец поместит в новый массив новый элемент. На это уходит куча времени (ну и памяти конечно). Поэтому внимательно проследите не заносите ли Вы данные за границы массива.
0
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
31.10.2016, 19:13  [ТС]
Так, хорошо. Я углублюсь, и когда что-то изменится - ещё буду писать. Спасибо! Но вопрос, конечно, ещё очень далёк до закрытия.
0
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
16.11.2016, 09:50  [ТС]
Похоже, что я всё-таки неправильно проверял: передавая в функцию, я менял матрицу целиком, и, по всей видимости, основное время уходило как раз на изменение каждого элемента матрицы. Если менять один элемент - то время обработки снижается, кажется, в 300 раз при передаче по указателю.

Но программа всё равно не работает, как хотелось бы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2016, 09:50
Помогаю со студенческими работами здесь

Глобальные переменные
Здравствуйте. Объясните пожалуйста как объявлять глобальные переменные. Спасибо.

Глобальные переменные
у меня есть файл в котором генерируется страничка сайта, мне надо там присвоить глобальной переменной значение , которое потом должно...

Глобальные переменные
проблема в том, что не знаю как задать глобальную переменную. Надо что бы при каждом обновлении страници данная переменная увеличивалась на...

Глобальные переменные
Тут у меня появилась одна затея, но что-то в ней усомнился. Имеются некие переменные (тексты, массивы), используемые во многих скриптах...

Глобальные переменные
Подскажите пожалуйста, почему данные в глобальной переменной перезаписываются, а не плюсуются? Пример: int peremennaya; void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru