Ошибки при попытке добавить точки на график3

Я пытаюсь динамически добавлять информацию в 3D-график:

A = [ -8/3 0 0; 0 -10 10; 0 28 -1 ];
y = [35 -10 -7]';
h = 0.01;
p = plot3(y(1),y(2),y(3),'.','EraseMode','none','MarkerSize',2);
axis([0 50 -25 25 -25 25])
hold on
while 1
    A(1,3) = y(2);
    A(3,1) = -y(2);
    ydot = A*y;
    y = y + h*ydot;
    set(p,'XData',y(1),'YData',y(2),'ZData',y(3))
    drawnow
end

Я получаю следующие ошибки:

Предупреждение. Свойство EraseMode больше не поддерживается и будет вызывать ошибку в будущем выпуске.

В Strange_attractor (строка 4) Предупреждение. Свойство EraseMode больше не поддерживается, и в будущем выпуске возникнет ошибка.

В Strange_attractor (строка 4) Ошибка при использовании matlab.graphics.chart.primitive.Line/set Недействительный или удаленный объект.

Ошибка в наборе странно_аттрактора (строка 12) (p, 'XData', y (1), 'YData', y (2), 'ZData', y (3))

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

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

Версия Matlab: R2018a


person Evgenii    schedule 26.07.2018    source источник
comment
Спасибо, Сардар, я прочитал документацию, но не знаю, как заставить мой пример работать.   -  person Evgenii    schedule 26.07.2018
comment
Это не работает.   -  person Evgenii    schedule 26.07.2018
comment
Когда вы хотите динамически добавлять информацию, вы намерены также сохранить ранее нанесенные значения?   -  person Sardar Usama    schedule 26.07.2018
comment
Да, я хочу сохранить ранее нанесенные точки.   -  person Evgenii    schedule 26.07.2018
comment
Вы хотите заменить использование plot3 вне цикла на plot3(y(1),y(2),y(3),'.','MarkerSize',2); и заменить set(.....): на это plot3(y(1),y(2),y(3),'.', 'MarkerSize',2); ?   -  person Sardar Usama    schedule 26.07.2018
comment
Это работает спасибо. Однако я обеспокоен тем, что он каждый раз создает новый объект сюжета и работает медленно, а также съедает всю доступную память. Смысл моего предыдущего примера в том, чтобы использовать существующий график и просто добавлять к нему новые точки в цикле. Можно ли это сделать с новой версией Matlab?   -  person Evgenii    schedule 26.07.2018
comment
Как вы ожидаете, что бесконечный цикл без условий прерывания не займет всю память?   -  person Sardar Usama    schedule 26.07.2018
comment
Ты прав. Я имел в виду, что использование plot3 каждый раз внутри цикла немного затратно. Мое намерение состояло в том, чтобы вызвать plot3 один раз, а затем добавить новые точки к существующему графику в цикле while. Таким образом, он будет потреблять меньше памяти и будет работать быстрее. Но спасибо за вашу помощь! :)   -  person Evgenii    schedule 26.07.2018
comment
У вас есть хороший ответ ниже, но вы также можете просто удалить бит 'EraseMode','none' из вызова plot3, и все должно работать как раньше. В конце концов, это всего лишь предупреждение... Сообщение об ошибке появилось только после того, как вы закрыли окно, не так ли?   -  person Cris Luengo    schedule 26.07.2018


Ответы (1)


В вашем комментарии выше, когда вы говорите «Это не работает», что вы имеете в виду? Прямая модификация вашего кода по данной ссылке на документацию работает как положено:

A = [ -8/3 0 0; 0 -10 10; 0 28 -1 ];
y = [35 -10 -7]';
h = 0.01;
p = animatedline(y(1),y(2),y(3),'Marker','.','MarkerSize',2);
axis([0 50 -25 25 -25 25])
hold on
while 1
    A(1,3) = y(2);
    A(3,1) = -y(2);
    ydot = A*y;
    y = y + h*ydot;
    addpoints(p,y(1),y(2),y(3))
    drawnow
end

введите здесь описание изображения

person Phil Goddard    schedule 26.07.2018
comment
Спасибо, теперь это работает! Я новичок в Matlab и не смог правильно применить предложение из документации. :) - person Evgenii; 26.07.2018