在我的代码中,有一行如下所示:
f=@(test) bf{i}(5);
其中bf是一个单元格数组,其中存储了来自str2func()的函数,i是一个存储整数的变量,而5是传递给该函数的参数。我如何让Matlab使用i的当前值评估线?现在,当我显示f时,它输出:
@(test)bf{i}(5)
假设i = 1,我希望它输出:
@(test)bf{1}(5)
尽管从技术上讲,bf {1}也应替换为bf {1}中存储的任何函数。如何强制matlab评估此语句中的变量?
创建函数句柄时,将在调用函数句柄时复制工作区变量并评估表达式(通常在内存消耗方面不是问题,matlab仅存储更改)。
现在的问题是,告诉Matlab什么时候评估表达式的哪一部分。如果您希望获得更好的性能,请预先评估该功能的所有恒定部分。假设您的函数是@(x)(g(3).*f(x))
,在这种情况下,matlab将g(3)
在每次调用时求值。
而是使用:
f=@(x)(x.^2)
g_3=g(3)
h=@(x)(g_3.*f(x))
现在已经评估了常量部分,您想查看常量而不是variabe名称。我知道实现此目的的两种方法。
您可以使用符号工具箱,基本上将函数句柄转换为符号函数,然后再次转换为函数句柄。这不仅显示常量,而且还显示f
。并非对所有功能都可行。
>> matlabFunction(h(sym('x')))
ans =
@(x)x.^2.*4.2e1
另一种可能性是使用eval:
h=eval(['@(x)',sprintf('%e',g_3),'.*f(x)'])
通常建议像我在第一步中那样对表达式的常量部分进行预评估,但是实际上不建议使用两种方法来使常量在函数句柄中可见。第一种解决方案matlabFunction
仅使用某些功能,而第二种解决方案则具有的所有缺点eval
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句