问题描述
我需要访问 MATLAB 的 Simulink.parameter 类型工作区中的变量值:
CAL_vars = dsdd('find','/path/CAL','ObjectKind','Variable','Property',{'name' 'Class' 'value' 'CAL'}) %gets ids of variables in data dictionary i = 10 for i=1:length(CAL_vars) var_name = dsdd('GetAttribute',CAL_vars(i),'name'); % gets names of variables in data dict var_eval = eval(var_name); % this works in standalone script and it does exactly % what I need, but once i put it in the function I need this for, it returns error if (length(var_eval.Value) ==1) if (var_eval.Value == true) var_eval.Value = 1; elseif (var_eval.Value == false) var_eval.Value = 0; else end end % do something with the Value if (errorCode ~= 0) fprintf('\nSomething is wrong at %s\n', var_name) end end
出现问题是因为结构是由 Simulink 制作的,并且当我尝试为"Simulink.Parameter"类型的输入参数调用 eval(name_of_var): Undefined function 'eval' 时会出错.
奇怪的是,它似乎在独立脚本中正常运行,但是一旦我将它插入到更大的函数中,它就会停止工作并开始显示错误提示
Error using eval Undefined function or variable 'name_of_var'.
函数在工作区中清晰可见.
推荐答案
奇怪的是,它似乎在独立脚本中正常运行,但一旦我将它插入更大的功能,它就会停止工作
这是预期的行为.一个函数有自己的工作空间并且可以'不直接访问基础工作区中的变量.
您可以尝试使用 evalin 而不是 eval,并指定base工作区:
<块引用>evalin(ws, expression) 执行 expression,一个字符向量或包含使用变量的任何有效 MATLAB® 表达式的字符串标量在工作区 ws 中.ws 的值可以是 'base' 或 'caller'表示 MATLAB 基础工作区或调用者的工作区功能.
一般来说,如果可能的话,尽量避免使用 eval 的原因有很多(请参阅 eval 的 MATLAB 帮助),最好能找到一种不同的方法来获取这些数据.