以字符串形式获取给定名称的对象句柄 (MATLAB)

Get object handle given the name as a string (MATLAB)

给出一个变量的名称作为字符串(在我的例子中,用户选择的工作区中现有 Simulink.Parameter 变量的名称作为优化的设计变量),我想成为能够在不使用 eval() 的情况下访问对象的属性,例如 Simulink.Parameter.Min、Simulink.Parameter.Max、Simulink.Parameter.Value 。到目前为止,我正在使用(非常丑陋的)解决方案

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 returns the variable name of an explicit function input as a string but does not work for cell arrays of objects (see this question).
  • str2func returns 以字符串作为输入但不允许访问属性的函数句柄。
  • findobj returns 对象给定了一个对象数组来迭代我没有的对象。可能有一种方法将所有工作区变量句柄作为数组返回吗?

谢谢!

这正是 eval 的用途。是的,你应该避免使用 eval,但如果你想让用户输入要评估的东西,你需要 evalOr evalin if you want to evaluate it in the base or caller workspace 而不是当前工作区。

没有"object handles"这样的东西(图形对象除外,但这不是你在这里谈论的)。有变量拥有数据数组,就是这样。

如果您不信任您的用户,请不要使用 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