【问题标题】:Why are predefined variables not shown with their value in function handles?为什么预定义的变量没有在函数句柄中显示它们的值?
【发布时间】:2021-09-07 22:11:33
【问题描述】:

在 MATLAB R2020b 中,我有以下代码:

f=@(x) x.^2;
y=2;
g=@(x) f(x).*y

输出是

g = function_handle with value: @(x)f(x).*y

但是y = 2,所以我希望输出是@(x)f.*2。这是它应该如何工作还是一个错误?我可以将其显示为f.*2 而不是f.*y

【问题讨论】:

  • 我会说它应该是这样工作的,但只有 MathWorks 自己才能告诉你原因。至于更改显示:您需要重载函数句柄类的默认 disp() 方法,即您需要直接修改此类的 MATLAB 源代码。这可能是不可能的,例如如果代码是预编译和/或混淆的,即使可能,我建议不要修改 MATLAB 源文件。您也许可以编写一个包装函数,而不是在 disp() 调用函数句柄时调用。
  • 只是为了验证y 发生了什么:如果您执行y = 3;h=@(x) f.*y 然后将输出与g 的输出进行比较会发生什么?当然:g(2)h(2) 会发生什么?输出是否相同,即yg 中的值是否发生了变化,还是不同?
  • 实际上我的意思是输入 g(x)=@(x)f(x).*y,就像编辑过的那样。然后g(2) 给我 8,h(2) 给我 12。所以当我输入参数时它就起作用了。但我需要创建一个勒让德多项式数组(通过递归)P_=cell(1,N+1); P_{1}=@(u_) 1; P_{2}=@(u_) u_; for n=1:N, P_{n+2}=@(u_)((n+1)*@(u_)P_{n+1}(u_)-n*@(u_)P_{n}(u_))/(2*n+1); end,它永远不会进展,因为每个单元格在循环中都有 n 但没有它的值。对此有何想法?
  • “它永远不会前进,因为每个单元格在循环中都有 n 但没有它的值”——我认为这确实有效,只是你无法从显示的函数中看到它。评估它们以进行验证。但无论如何,使用具有常数因子的向量来表示多项式要容易得多,请参阅here
  • 是的,效率更高。与调用一个调用两个匿名函数的匿名函数相比,评估该多项式表示只是一个点积,后者又调用了四个匿名函数......

标签: matlab function-handle


【解决方案1】:

当您创建函数句柄g = @(x) f(x).*y 时,变量fy 的当前值将“冻结”到g 的定义中,如documentation 中所述。

要检查g 使用的fy 的实际值,您可以调用functions,如下所示:

>> info = functions(g); disp(info)
            function: '@(x)f(x).*y'
                type: 'anonymous'
                file: ''
           workspace: {[1×1 struct]}
    within_file_path: '__base_function'

具体见workspace字段:

>> disp(info.workspace{1})
    f: @(x)x.^2
    y: 2

【讨论】:

  • 不错。正如 Andras 在聊天中评论的那样:“一个 5000 大小的矩阵的封闭变量不会被替换是有道理的”。将变量复制到函数句柄中允许延迟复制。
猜你喜欢
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2020-03-20
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多