2010-06-25 11 views
12

Я очень новичок в MATLAB, и я пытался отобразить график в реальном времени некоторых вычислений. У меня есть вектор размером N, и я работаю с m значениями за раз (скажем m = N/4), поэтому я хочу построить первые значения m, а затем, как только будут вычислены значения второго значения m, замените их первый график.Участок реального времени в MATLAB

Мой подход был следующим:

for i=1:N, 
    ... 
    //compute m 
    ... 
    plot(m); 
end; 

, но он не обновлять сюжет в каждом цикле и ждет всех петель до конца, чтобы Plot данные. Мой вопрос: следует ли использовать другую функцию вместо plot или я могу добавить задержку в каждом цикле?

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

+0

Связанные: https://stackoverflow.com/questions/13102654/how-should-i-update-the-data-of-a-plot-in-matlab –

ответ

11

Вы можете добавить звонок в DRAWNOW, чтобы заставить участок обновиться. См. reference page. Обратите внимание, что DRAWNOW вызывает сброс очереди графических событий, что может привести к обратным вызовам и т. Д.

+0

Прошло некоторое время, но вы можете захотеть смотреть и использовать doublebuffering. Я не помню, где установить эту опцию - но в то время это точно изменилось :) – Chau

+2

Двойная буферизация - свойство фигуры - «set (gcf,« DoubleBuffer »,« on »)» или аналогичный. Также может помочь, но для обновления требуется DRAWNOW. – Edric

+0

На самом деле мне не хватало команды натягивания. Большое спасибо. – kirbuchi

29

В качестве Edric mentioned вы обязательно захотите включить команду drawnow после вызова plot, чтобы принудительно обновить графику. Тем не менее, существует гораздо более эффективный и более плавный способ анимации сюжетов, который не предполагает воссоздания всего сюжета каждый раз. Вы можете просто инициализировать свой сюжет, захватить handle объекту сюжета, а затем изменить свойства этого объекта в своем цикле, используя команду set. Вот пример:

hLine = plot(nan);   % Initialize a plot line (which isn't displayed yet 
          % because the values are NaN) 
for i = 1:N    % Loop N times 
    ... 
    % Compute m here 
    ... 
    set(hLine, 'YData', m); % Update the y data of the line 
    drawnow     % Force the graphics to update immediately 
end 

Кроме того, до вашего цикла и после вызова plot вы можете установить ряд axes properties, как axes limits и т.д., если вы хотите оси оставаться фиксированными и не менять их внешний вид с каждым новым вектором m, который нанесен на график.

+0

Спасибо, что сделал трюк! Решение как твое, так и Эдрика работало очень хорошо. Но если я сделаю это по-своему, ему не придется каждый раз переписывать. – kirbuchi

+0

@kirbuchi Почему это не принятый ответ? – vvy

+0

@vvy Я принял другой, так как он пришел первым и помог мне решить мою проблему, но я тогда понял, что это лучше. Думаю, количество голосов говорит само за себя. – kirbuchi