#image #matlab #plot #matlab-figure
#изображение #matlab #сюжет #matlab-рисунок
Вопрос:
У меня есть 3 .m файлов, и каждый из них строит график. Мне нужно наложить результаты из трех из них, поэтому я скопировал три кода в один файл .m.
Проблема в том, что мне нужно очистить (с помощью команды «очистить») между каждой программой и, следовательно, между каждым графиком.
У кого-нибудь есть какие-либо предложения о том, как изобразить три результата на одном рисунке, пожалуйста?
Спасибо! 🙂
Комментарии:
1. Не идеально иметь много переменных на верхнем уровне (область действия командной строки). Если вы переносите свои скрипты внутрь функции, переменные автоматически очищаются при возврате функции (когда они выходят за пределы области видимости). Стоит подумать.
2. Почему бы не преобразовать скрипты в функции, которые выводят данные для построения графика, чтобы вы могли собрать их в одном месте?
3. @excaza — я писал это в ответе, когда вы опубликовали свой комментарий … 🙂
4. да, это хорошая идея!! Я попробую это! Единственная проблема в том, что у меня много переменных, но это звучит как лучший вариант! большое вам спасибо !! 🙂
Ответ №1:
Попробуйте следующий подход: один файл, содержащий четыре функции.
function plotEverything()
[x1 y1] = data1();
[x2 y2] = data2();
[x3 y3] = data3(0.5);
figure
plot(x1, y1);
hold all;
plot(x2, y2);
plot(x3, y3);
title 'my awesome plot of everything';
xlabel 'X'; ylabel 'Y';
legend({'one', 'two', 'three'});
end
function [x y] = data1()
x = 1:5;
y = 0.5 * x;
end
function [x y] = data2()
x = 2:2:10;
y = sqrt(x);
end
function [x y] = data3(p)
x = linspace(0,7,15);
y = 0.1 * rand(size(x)) p * x.^2;
end
Поместите его в файл plotEverything.m
и вызовите его из командной строки с plotEverything
помощью . Нет необходимости явно очищать какие-либо переменные — все, что было создано в любой из функций, исчезнет к моменту возврата последней функции, и все, что создано отдельными функциями (обратите внимание, что я вызвал все x
, y
— это было преднамеренно), невидимо для других функций, поскольку оно имеет локальную область видимости.
Теперь код организован — есть функция только для построения графика и функция для генерации данных, которые входят в каждый из графиков. Очевидно, что ваши функции data1
и т.д. будут более сложными, чем мои, но идея та же.
Комментарии:
1. большое вам спасибо за этот пример!! Я попробую это или также, поскольку у меня каждая программа написана по-разному, я превращу их в функции, как вы упоминали ранее, чтобы у меня все было более организованно. В противном случае у меня будет более 600 строк кода в одном файле .. : O Большое вам спасибо! Действительно хорошая помощь!
2. Рад, что вам это нравится. Конечно, вы можете сохранить функции в разных файлах — достаточно просто преобразовать их в функции и возвращать только те значения, которые нужно отобразить, чтобы все работало намного чище.
Ответ №2:
Вы можете использовать эту строку:
clearvars -except YourVariables
В котором YourVariables — это те, которые вы хотите сохранить.
Комментарии:
1. 1, о котором я не знал
clearvars - except ...
. Очень полезно!
Ответ №3:
Я полагаю, что когда вы очищаете переменные после каждого скрипта, это означает, что вам не нужны переменные из одного скрипта для запуска другого. Таким образом, вы можете использовать это
figure; %// a figure will open up
hold on;
call script 1
clear;
call script 2
clear;
call script 3;
clear;
На рисунке, открытом в начале, будут все наложенные графики.
Также позаботьтесь о том, чтобы ни один из ваших скриптов не вызывал figure
command(они могут вызывать plot
command), иначе откроется новая фигура, и графики не будут наложены
Комментарии:
1. Это должно сработать, если отдельные сценарии хорошо сконструированы. Я бы рекомендовал, если возможно, оставить вычисления в трех отдельных файлах, но поместить все команды построения графика в один файл. Это позволяет с первого взгляда увидеть, как строится график, оставляя детали того, что отображается в других файлах.
2. да, именно это я и собираюсь сделать! спасибо за это разъяснение, я, вероятно, тоже ошибусь, если вы мне не скажете! спасибо!!! : D