MATLAB禁止在函数中放置disp()实例的命令行

MATLAB suppress command line put of disp() instances in a function

在一个函数中,我有一些disp()实例来帮助跟踪长时间计算过程的进度。

例如,

1
2
3
4
5
function myfun(inputs)
    ...
    disp('Step i finished')
    ...
end

myfun的其他一些用法中,没有disp()消息更为方便。 有没有一种方法可以在不添加新代码或不使用eval()函数的情况下抑制命令行中的"步骤i完成"消息?

注意:已知eval()对于任何严肃的计算来说都太慢了。


在MATLAB中,没有机制可以重定向" stdout"。您可以使用evalc捕获它,然后将其忽略,但这也可以捕获(并因此取消)所有警告。同样,所有使用eval的常见反对意见均适用。

如果您坚持认为,则可以使用此不良BAD hack:

1
disp = @(~) display([]);  %# at the start of the function

或者,如果您确实不想更改函数中的单个字母,请输入

1
function disp(~)

在MATLAB路径上的单独M文件中,完成后从MATLAB路径中删除其路径(或删除/重命名文件)。

但实际上,最好的方法是重写函数,以便显示是可选的,并且/或者显示级别是可调的。例如,就像几乎所有MATLAB自带的函数一样:

1
2
3
4
5
6
options = optimset('Display', 'iter-detailed');
[~] = fminsearch(@cos, 3, options);


spparms('spumoni', 2);
sparse(rand(4)) \\ rand(4,1)


实现打开/关闭诊断消息的能力的一种非常简单的方法是使用实??用程序功能vfprintf

1
2
3
4
5
6
7
function vfprintf(verbose, varargin)

if verbose
    fprintf(varargin{:})
else
    % Do nothing
end

然后,您可以将verbose设置为true或false,否则可以像fprintf一样使用该函数。您也可以做类似的事情来创建vdisp函数。