【问题标题】:How do I make an "empty" anonymous function in MATLAB?如何在 MATLAB 中创建“空”匿名函数?
【发布时间】:2010-12-26 16:09:25
【问题描述】:

在 MATLAB 中进行调试时,我使用匿名函数进行诊断打印。例如,

debug_disp = @(str) disp(str);
debug_disp('Something is up.')
...
debug_disp = @(str) disp([]);
% diagnostics are now hidden

disp([]) 用作“狼吞虎咽”对我来说似乎有点脏;有更好的选择吗?明显的 (?) 方法不起作用:

debug_disp = @(str) ;

我认为,这可能对其他函数式语言应用程序有用,而不仅仅是诊断打印。

【问题讨论】:

    标签: matlab anonymous-function


    【解决方案1】:

    您可以在代码库中添加一个常规的无操作函数。

    function NOP(varargin)
    %NOP Do nothing
    %
    % NOP( ... )
    %
    % A do-nothing function for use as a placeholder when working with callbacks
    % or function handles.
    
    % Intentionally does nothing
    

    然后,您可以使用函数句柄而不是匿名函数,只要您想不执行任何操作。

    debug_disp = @NOP;
    

    现在它有点自我记录,明确表明您打算什么都不做,而不是为 disp() 获取错误的输入。这在源代码中很明显,此外,当您在调试器中并检查保存函数句柄的变量时,它将显示为“@NOP”,这可能比匿名句柄更具可读性。通过查看 NOP 的调用者列表,您可以在“配置文件报告”输出中获得所有 nopped-out 操作的列表。

    您也可以使用 Matlab 的内置 @deal,在退化的情况下,它什么也不做,也不返回任何内容。

    【讨论】:

    • 我最喜欢这种方法。尽管付出了额外的努力,但我认为这确实是最干净的方式。
    • 在我的机器上,这种方法比我尝试过的两个版本都快。当句柄为 handle=@NOP 时,对 handle() 的 100 万次调用需要 7.09 秒。而handle=@()[]; 需要 23.2 秒。我想这是因为对象创建的开销。 handle=@() drawnow('update'); 需要 3.37 秒。 handle=@() disp([]);handle=@() disp(''); 在 9.71 秒时并列。最快的函数是handle=@() (1);,时间为 0.775 秒。但是,它的调用必须以分号结束。
    • 哎呀handle=@() drawnow('update'); 花了 34.0 秒来完成一百万次调用。我在输入 1000000 时不小心漏掉了一个 0。顺便说一句,这仍然比 handle=@() drawnow; 快得多 - 花了 187 秒。
    • 在 R2015a 中,我发现@Eponymous 的建议中最快的是 nop 函数,它在与调用函数相同的 m 文件中实现。在我的机器上调用 100 万次需要 4.72 秒。然而,一个稍微快一点的实现是创建一个 nop mex 函数(它同样什么也不做)。这花了 3.39 秒。
    • 仅供参考,在我的代码库中,我现在采用调用此函数 pass 的方法,因为这是 Python 用于等效语句的术语。
    【解决方案2】:

    我认为disp([])disp('') 完全可以接受。它不返回任何东西,也没有副作用。

    【讨论】:

    • 我将其解释为@(varargin) disp(''),这是我见过的最简洁、无操作的函数(允许任意数量的输入)。
    【解决方案3】:

    这是一个什么都不做的匿名函数。它什么也不做,并返回一个空数组,您可以忽略它。你需要在 disp 后面加上一个分号来抑制它。

    debug_disp = @(str) [];
    

    disp([]) 也应该可以正常工作。无论您喜欢哪种风格。

    【讨论】:

      【解决方案4】:

      如果您只是在寻找“无所事事”命令来替换匿名函数的主体,我可能会选择 DRAWNOW

      debug_disp = @(str) drawnow;
      

      这将简单地刷新事件队列并更新图形而不是显示任何文本。

      【讨论】:

      • 如果您有打开的图形窗口,drawnow() 事件会导致性能下降。
      • @shabbychef:如果不想更新图形,可以使用drawnow('UPDATE')
      • @gnovice:字符串drawnow('update')使用小写很重要,否则Matlab会报“未知命令选项”
      【解决方案5】:

      试试debug_disp = @(str)(1);

      【讨论】:

      • @Andrew Janke 的评论也适用于这里:如果你这样做,你对debug_disp 的所有调用都需要用分号终止,否则 MATLAB 将显示ans = 1 :-( .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      相关资源
      最近更新 更多