Матлаб сюжет в реальном времени - PullRequest
7 голосов
/ 26 ноября 2011

Я новичок в Matlab и хочу отобразить некоторые данные в режиме реального времени.Мой подход был следующим:

figure;
hold on;

for i = 1:1000;
   plot(i, i);
   drawnow;
end

Но он имеет низкую производительность.

Я также нашел здесь предложение по stackoverflow: https://stackoverflow.com/q/3118918/1066838, но рисуются только последние данные,поэтому я всегда вижу только одну точку на рисунке.

Ответы [ 2 ]

21 голосов
/ 26 ноября 2011

Вместо выполнения высокоуровневого вызова plot рассмотрите возможность настройки свойств дескриптора линии *1003*, в частности XData и YData, в цикле:

figure(1);
lHandle = line(nan, nan); %# Generate a blank line and return the line handle

for i = 1:1000
    X = get(lHandle, 'XData');
    Y = get(lHandle, 'YData');

    X = [X i];
    Y = [Y i];

    set(lHandle, 'XData', X, 'YData', Y);
end

Делая это таким образом, tic / toc до / после кода дает 0,09 секунды;наивный plot, как вы, как вы, наверное, видели, дает время выполнения почти 20 секунд.

Обратите внимание, что я использовал get в этом примере только для генерации набора данных;Я предполагаю, что для графика в реальном времени у вас есть DatasetX и DatasetY, поэтому вам нужно соответствующим образом обработать ваши данные.Но, в конце концов, как только вы получите набор данных, который хотите построить в определенное время, просто set вся строка XData и YData.

Наконец, обратите внимание, что это setвызов становится немного громоздким для очень больших наборов данных, так как мы должны каждый раз устанавливать данные строк, а не добавлять их к ним.(Но это, конечно, все же быстрее, чем использование plot.) Это может быть достаточно хорошо, в зависимости от того, как часто меняется ваш набор данных.См. этот вопрос для более подробной информации.


EDIT : Начиная с MATLAB R2014b, объект animinatedline упрощает построение точек из потоковых данных:

Анимированные линейные объекты оптимизируют линейную анимацию, накапливая данные из потокового источника данных.После создания исходной анимированной линии с использованием функции анимированной линии вы можете добавлять новые точки в линию без необходимости переопределять существующие точки.Измените внешний вид анимированной линии, задав ее свойства.

0 голосов
/ 26 ноября 2011

Чтобы улучшить преформанс, вы должны использовать clf, он очищает фигуру.В противном случае все графики складываются друг на друга.

Если вы хотите сделать plot(x,y) в режиме реального времени, вы должны сделать:

figure;
hold on;

for i = 1:1000;
   clf;
   plot(x(1:i), y(1:i));
   drawnow;
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...