|
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
|
|
| 24.10.2016, 20:55 | |
|
Ответы с готовыми решениями:
12
Глобальные переменные Глобальные и статические глобальные переменные глобальные переменные |
|
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 | ||||
|
Добавлено через 53 секунды Добавлено через 1 минуту
0
|
||||
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|||
| 25.10.2016, 11:36 | |||
|
В MATLABe есть специальное направление, автоматизация испытаний и управления, и там используются специальные модули MATLAB и так называемые машины реального времени. К сожалению из-за финансового кризиса мы недоросли до этих возможностей, поэтому здесь у меня только теоретические познания.
Вообще если есть возможность, то желательно разделить процессы по времени, сначала собирать данные, а потом их обрабатывать. Как-то я пытался протестировать как лучше передавать данные в функцию при решении системы диффуравнений - глобальными переменными или в виде параметров функции. В результате оказалось, что тестирование дает большой разброс по результатам, во время выполнения теста 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++ старт функции таймера происходит не потому, что точно прошел интервал времени равный периоду таймера, а потому что в момент опроса таймера текущее время больше чем время старта функции таймера. Поэтому возможны большие разбросы по моментам запуска функций таймера)
0
|
|||
|
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
|
||||||||||
| 25.10.2016, 14:35 [ТС] | ||||||||||
https://www.mathworks.com/matl... -13-r2011b то распараллеливание должно давать прирост в скорости... Но основная проблема у меня сейчас, наверное, всё-таки именно огромные переменные. Если с ними не удастся улучшить ситуацию, буду изучать запуск параллельной обработки.
0
|
||||||||||
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|||||||
| 25.10.2016, 16:03 | |||||||
|
http://matlab.exponenta.ru/gui/book2/3.php#3
0
|
|||||||
|
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
|
|||
| 25.10.2016, 16:33 [ТС] | |||
|
0
|
|||
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
||
| 26.10.2016, 07:38 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 7
|
||
| 28.10.2016, 10:06 [ТС] | ||
|
Кроме того, попробовал создавать матрицу как объект handle. Разницы во времени, похоже, нет. Почитал на форумах https://www.mathworks.com/matl... ead/311995 понял так, что MATLAB сам распознаёт, когда у матрицы большой размер и её становится быстрее обрабатывать через указатель, и оптимизирует это, вроде как, начинает сам обращаться к ней по указателю. Как вы думаете, правдоподобно? Или я опять что-то не так делаю?
0
|
||
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
||
| 28.10.2016, 12:34 | ||
|
В функцию данные можно передать в качестве параметра или в качестве указателя (для С, С++, Паскаля, 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
|
|
| 16.11.2016, 09:50 | |
|
Помогаю со студенческими работами здесь
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
|