【发布时间】: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 问题。拥有一个从用户那里获取字符串以生成新变量的软件是一个非常糟糕的主意。