如何让Matlab使用变量值而不是名称

时间:2015-08-22 06:05:35

标签: matlab

在我的代码中,我有一行看起来像这样:

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评估此语句中的变量?

1 个答案:

答案 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的所有缺点。