【问题标题】:How can I get Matlab to use the variable value instead of name如何让 Matlab 使用变量值而不是名称
【发布时间】:2015-08-22 06:05:34
【问题描述】:

在我的代码中,我有一行如下所示:

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

【问题讨论】:

  • 您知道函数句柄保留自己的变量副本吗?因此,稍后更改 i 或 bf 不会改变结果。
  • 我想这基本上使我所问的问题变得不可能,您可以将其作为答案,如果您愿意,我会接受
  • 这并不是不可能的,只是想知道确保您正确理解函数句柄。
  • 当你说你想要它输出 @(test)bf{1}(5)。你的意思是像函数的字符串表示一样,还是你想要数组bf中第一个函数产生的数字输出,输入值@987654326 @ ?
  • 我希望能够将 i 插入函数调用并取出存储在 bf 中该位置的函数,所以如果 bf{1} 是 rectMath,那么我想要的最终值f 为 @(test)rectMath(5)

标签: matlab


【解决方案1】:

创建函数句柄时,会复制工作区变量,并在调用函数句柄时计算表达式(通常不是内存消耗问题,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 的所有缺点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2010-12-31
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多