【问题标题】:Get object handle given the name as a string (MATLAB)以字符串形式获取对象句柄(MATLAB)
【发布时间】:2018-05-16 23:40:23
【问题描述】:

以字符串形式给出变量的名称(在我的情况下,用户选择工作区中现有 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 返回给定对象数组的对象,以迭代我没有的对象。是否有一种方法将所有工作区变量句柄作为数组返回?

谢谢!

【问题讨论】:

  • object{1}.(varnames{i}) 适合你吗?
  • varnames 指的是对象本身的名称,而不是字段名称,因此它不起作用。首先,我必须将指向我的对象的指针存储在我正在使用eval 的单元格中(参见原始帖子)。
  • 问题:你为什么从“被赋予一个变量的名字作为一个字符串”开始?就没有别的办法了吗?
  • 我希望用户输入变量的名称或变量本身,但不能同时输入两者,所以必须从另一件事派生出一件事
  • 缺少信息。什么用户?我之所以问,是因为您似乎在问一些不是您真正的问题的尝试的解决方案,即经典的 XY 问题。拥有一个从用户那里获取字符串以生成新变量的软件是一个非常糟糕的主意。

标签: matlab simulink handle


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 2011-09-20
    • 2012-11-16
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多