亲爱的 Stackoverflow 社区,
我目前对 Matlab 中的一个重要问题感到困惑。也许有人以前遇到过类似的问题。
想象一下,之前从外部 ini 文件导入了一些用户输入,包括变量名称列表、变量值和要计算的方程式,例如
names = { 'var1', 'var2' };
values = { 1.23, 4.56 };
equation = 'db( var1 / var2 )';
是否有一种简洁的方法来评估此类输入的结果,将评估期间的访问范围限制为仅用户变量和内置数学函数?
可以将用户变量分配到一个专用函数的清理工作区,并且可以在那里执行评估,这样除了用户变量之外没有其他变量可以访问评估,例如:
% evaluate user function in a workspace containing user parameters only
function out = cleanEval( equation, names, values )
% descend into a subfunction to operate on this workspace
out = cleanEvalCore( equation, names, values );
function out = cleanEvalCore( equation, names, values )
% clear all variables from the caller workspace (we have them here)
evalin( 'caller', 'clear' );
% assign user variables from names/values to the caller workspace
for ii = 1 : numel( names )
assignin( 'caller', names{ ii }, values{ ii } );
end
% evaluate user function in the caller workspace
out = evalin( 'caller', equation );
但是,只要使用“eval”进行评估,就可能存在将第三个代码输入用户函数的误用情况,例如
names = { 'var1', 'var2' };
values = { 1.23, 4.56 };
equation = 'myGUI.closeWindow()';
或者例如
equation = '!format C:\';
...如果按原样评估,可能会导致有趣的结果。
将公式字符串转换为“用户变量的函数句柄”并不能解决问题,因为公式中的任何第三个命令仍将被计算。
是否有典型的方法来限制单个评估语句的范围,以便它只能访问标准数学函数(例如 min/max/sin/cos/exp/log/db)或给定列表的函数,但没有别的?
或者有没有一种方法可以使用一些内置数学来计算方程式。引擎而不是 EVAL?
最佳答案
刚刚在 Matlab 支持论坛的重复线程中解决了:
可行的解决方案是手动解析和评估方程式,例如使用以下代码:
https://www.mathworks.com/matlabcentral/fileexchange/68458-evalequation
关于Matlab EVAL——将访问范围限制为选定的内置函数/变量子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64846614/