将变量的名称作为字符串给出(在我的例子中,用户选择的工作空间中现有Simulink.Parameter变量的名称作为优化的设计变量),我希望能够访问对象的属性,如Simulink.Parameter.Min,Simulink.Parameter.Max,Simulink.Parameter.Value ,不使用eval()。到目前为止,我正在使用(非常丑陋的)解决方案
varnames = {'var1','var2'}; % Simulink.Parameter objects existing in workspace
objects = cell(length(varnames),1);
for i = 1:length(varnames)
eval(['objects{i}=', varnames{i}, ';']) % Store objects in a cell array
end
理想情况下,这看起来像:
objects = get_object_handles_from_string(varnames);
value_1 = object{1}.Value(:);
否则,给定对象句柄返回变量名的方法也是可以接受的。
我发现不起作用但可能有用的方法:
谢谢!
答案 0 :(得分:1)
这正是eval
的用途。是的,您应该避免使用eval
,但如果您想让用户输入要评估的内容,则需要eval
。 Or evalin
if you want to evaluate it in the base or caller workspace而不是当前的工作区。
没有"对象句柄" (除了图形对象,但这不是你在这里谈论的)。有变量拥有数据数组,就是它。
如果您不信任您的用户,请不要使用eval
。他们可以键入任何内容,包括clear all
或!\rm -rf /*
(或者等同于擦除磁盘的Windows等等。)
在这种情况下,假设用户可以指定一组有限的变量,请执行
var1 = 1;
var2 = 2;
varnames = {'var1','var2'}; % Simulink.Parameter objects existing in workspace
objects = cell(size(varnames));
for i = 1:numel(varnames)
objects{i} = get_variable_value(varnames{i}) % Store objects in a cell array
end
function val = get_variable_value(name)
switch name
case 'var1'
val = evalin('caller',var1);
case 'var2'
val = evalin('caller',var2);
otherwise
error('Illegal variable name')
end