在我的代码中,我有一行看起来像这样:
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评估此语句中的变量?
答案 0 :(得分:2)
创建函数句柄时,复制工作空间变量并在调用函数句柄时计算表达式(通常不是内存消耗中的问题,matlab只存储更改)。
现在的问题是,告诉Matlab何时评估表达式的哪个部分。
如果您的目标是获得更好的性能,请预先评估函数的所有常量部分。假设您的函数为@(x)(g(3).*f(x))
,在这种情况下,matlab会在每次调用时评估g(3)
。
改为使用:
f=@(x)(x.^2)
g_3=g(3)
h=@(x)(g_3.*f(x))
现在评估常量部分,您希望查看常量而不是变量名称。我知道实现这一目标的两种方法。
您可以使用符号工具箱,基本上将函数句柄转换为符号函数,然后再转换为函数句柄。这不仅显示常量,还替换f
。这对所有功能都不可能。
>> matlabFunction(h(sym('x')))
ans =
@(x)x.^2.*4.2e1
另一种可能性是使用eval:
h=eval(['@(x)',sprintf('%e',g_3),'.*f(x)'])
我在第一步中预先评估表达式的常量部分通常是值得推荐的,但是在函数句柄中看到常量可见的两种解决方案并不值得推荐。使用matlabFunction
的第一个解决方案仅适用于某些功能,而第二个解决方案具有eval
的所有缺点。