获取以字符串形式命名的对象句柄 (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(:);

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

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

  • 谁在当前工作区中查找变量名称和属性,但没有句柄。
  • inputName 以字符串形式返回显式函数输入的变量名,但不适用于对象的单元格数组(请参阅此问题(。
  • str2func 返回一个以字符串作为输入的函数句柄,但不启用对属性的访问。
  • findobj 返回给定对象数组的对象以进行迭代,而我没有这些对象。是否有一种方法将所有工作区变量句柄作为数组返回?

谢谢!

这正是eval的用途。是的,您应该避免使用eval,但如果您想让用户输入要评估的内容,则需要eval。或者,如果要在基本工作区或调用方工作区而不是当前工作区中评估它,evalin

没有"对象句柄"这样的东西(图形对象除外,但这不是您在这里谈论的内容(。有变量拥有数据数组,就是这样。

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

最新更新