Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取以字符串形式给出名称的对象句柄(MATLAB)_Matlab_Simulink_Handle - Fatal编程技术网

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

获取以字符串形式给出名称的对象句柄(MATLAB),matlab,simulink,handle,Matlab,Simulink,Handle,以字符串形式给出变量名称(在我的示例中,是用户选择的工作区中现有Simulink.Parameter变量的名称作为优化设计变量),我希望能够访问对象的属性,例如Simulink.Parameter.Min、Simulink.Parameter.Max、,Simulink.Parameter.Value而不使用eval()。到目前为止,我采用的是(非常丑陋的)解决方案 理想情况下,这看起来像: objects = get_object_handles_from_string(varnames);

以字符串形式给出变量名称(在我的示例中,是用户选择的工作区中现有Simulink.Parameter变量的名称作为优化设计变量),我希望能够访问对象的属性,例如Simulink.Parameter.Min、Simulink.Parameter.Max、,Simulink.Parameter.Value而不使用eval()。到目前为止,我采用的是(非常丑陋的)解决方案

理想情况下,这看起来像:

objects = get_object_handles_from_string(varnames);
value_1 = object{1}.Value(:);
否则,返回给定对象句柄的变量名的方法也是可以接受的

我发现不起作用但在其他方面可能有用的方法:

  • 在当前工作区中查找变量名和属性,但不查找句柄
  • 以字符串形式返回显式函数输入的变量名,但不适用于对象的单元格数组(请参见此)
  • 返回以字符串作为输入的函数句柄,但不启用对属性的访问
  • 返回给定要迭代的对象数组的对象,我没有该数组。是否有一个方法将所有工作空间变量句柄作为数组返回

谢谢

这正是
eval
的目的。是的,您应该避免使用
eval
,但是如果您想让用户输入要评估的内容,您需要
eval
。而不是当前的工作区

没有所谓的“对象句柄”(图形对象除外,但这不是您在这里讨论的内容)。有些变量拥有数据数组,也就是说

如果您不信任您的用户,请不要使用
eval
。他们可以输入任何内容,包括
全部清除
\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

object{1}.(varnames{i})
适合您吗?
varnames
指的是对象本身的名称,而不是字段名,因此它不起作用。首先,我必须将指向我的对象的指针存储在一个单元格中,我现在正在使用
eval
(参见原始帖子)。问题:为什么你要从“将变量的名称作为字符串”开始?没有其他方法获取它吗?我希望用户输入变量的名称或变量本身,但不能同时输入两者,因此必须从另一个派生一个内容,因为缺少信息。什么用户?我这样问是因为你似乎在问一个,附加的解决方案,它不是你真正的问题,经典的XY问题。拥有一个从用户那里获取字符串以生成新变量的软件是一个非常糟糕的主意。
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