如何在MATLAB中创建一个"空"匿名函数?

Wil*_*son 15 matlab anonymous-function

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

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

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

debug_disp = @(str) ;
Run Code Online (Sandbox Code Playgroud)

我认为这可以用于其他功能语言应用程序,而不仅仅是诊断打印.

And*_*nke 16

您可以在代码库中添加常规的"无操作"功能.

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
Run Code Online (Sandbox Code Playgroud)

然后你可以使用函数句柄而不是匿名函数,无论你想要什么都不用.

debug_disp = @NOP;
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用Matlab的内置@deal,它在退化的情况下什么也不做,什么都不返回.

  • 在我的机器上,这种方法比我尝试的两个版本都快.当句柄为`handle = @ NOP`需要7.09秒时,100(100)次调用handle().而`handle = @()[];`需要23.2秒.我想这是因为对象创建的开销.`handle = @()drawow('update');`需要3.37秒.`handle = @()disp([]);`和`handle = @()disp('');`被绑定在9.71秒.最快的功能是`handle = @()(1);`时间为0.775秒.但是它的调用必须以分号结束. (5认同)
  • 哎呀`handle = @()drawow('update');`一百万次调用需要34.0秒.当我输入1000000时,我意外地忽略了0.顺便说一句,这仍然比`handle = @()drawow;` - 快了187秒. (2认同)

Ste*_*ins 10

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