Как преобразовать строку в имя переменной, которая будет передана в функцию plot - PullRequest
0 голосов
/ 15 октября 2018

Как я могу преобразовать строку в переменную, которая будет передана в функцию plot?

Time = [0,1,2,3];
A = sin(Time);
B = cos(Time);
c = 2*sin(Time);

lookup = {"A", "Freq(Hz)"; "B", "Pressure(bar)", "c", "time(ms),....};

for i=1:length(lookup)
    plot(Time, lookup(i,1))
    ylabel(lookup(i,2))
end

Я хочу построить Time против A и Time против B и Time против C аналогично у меня есть 50 различных переменных для построения графика.

Поэтому я планировал создать поиск со строкой и планировал передать в качестве переменной для построения функции, используя eval вызов функции.

Но в нескольких местах я читал, что использование eval не очень хороший вариант, поэтому, пожалуйста, предложите альтернативный метод.

1 Ответ

0 голосов
/ 15 октября 2018

Это решит вашу непосредственную проблему:

Замените

lookup = {"A", "Freq(Hz)"; "B", "Pressure(bar)", "c", "time(ms)", ...};

на

lookup = {A, "Freq(Hz)"; B, "Pressure(bar)", c, "time(ms)", ...};

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

С этим изменением остальная часть вашего кода должна работать как задумано.Возможно, вы захотите добавить команду figure или print внутри цикла, так как каждый график будет перезаписывать предыдущий.figure создает новое графическое окно для построения графика, у вас будет 50 окон (не очень хорошо).print может сохранить график в файл, что может быть лучшим подходом здесь.Не пытайтесь объединить 50 строк данных в одном графике, это будет беспорядок!


В более широком масштабе, вы можете пересмотреть свою стратегию с помощью определения 50 различных переменных.Массивы ячеек и структурные массивы - действительно хорошие способы сделать это.Например, вы можете думать о

data.A = sin(Time);
data.B = cos(Time);
data.c = 2*sin(Time);

или

data(1).values = sin(Time);
data(1).name = "A";
data(1).units = "Freq(Hz)";
data(2).values = cos(Time);
data(2).name = "B";
data(2).units = "Pressure(bar)";
data(3).values = 2*sin(Time);
data(3).name = "c";
data(3).units = "time(ms)";

Обратите внимание, что в первом случае вы также можете индексировать с помощью data.("A"), что приближает вас к вашемуоригинальная идея, за исключением того, что у вас нет 50 переменных в вашем рабочем пространстве, но есть одна единая структура данных, с которой легче иметь дело.


Вот очень подробный список причин, по которым eval может быть плохо использовать .Эта ссылка также показывает некоторые альтернативы, аналогичные тому, что я обобщил выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...