如何将字符串转换为变量名,该变量名将传递给绘图函数

时间:2018-10-15 18:12:50

标签: matlab

如何将字符串转换为将传递到绘图函数的变量?

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 vs ATime vs BTime vs C,同样我要绘制50个不同的变量

因此,我计划使用字符串创建查找,并计划使用eval函数调用将其作为变量传递给绘图函数。

但是在少数地方,我读到使用eval并不是一个好的选择,因此请建议使用其他方法。

1 个答案:

答案 0 :(得分:0)

这将解决您的直接问题:

替换

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个变量,而只有一个数据结构这样更容易处理。


Here is a very detailed list of reasons why eval can be bad to use。该链接还显示了一些替代方案,类似于我上面总结的。