获取对象句柄,名称为字符串(MATLAB)

时间:2018-05-15 15:10:17

标签: matlab simulink handle

将变量的名称作为字符串给出(在我的例子中,用户选择的工作空间中现有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(:);

否则,给定对象句柄返回变量名的方法也是可以接受的。

我发现不起作用但可能有用的方法:

  • whos在当前工作空间中找到变量名称和属性,但没有句柄。
  • inputname将显式函数输入的变量名称作为字符串返回,但不适用于对象的单元格数组(请参阅此question)。
  • str2func返回一个带有字符串作为输入的函数句柄,但不启用对属性的访问。
  • findobj返回给定对象数组的对象,以迭代我没有的对象。可能有一个方法将所有工作区变量句柄作为数组返回吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这正是eval的用途。是的,您应该避免使用eval,但如果您想让用户输入要评估的内容,则需要evalOr 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