MATLAB抑制函数中disp()实例的命令行put

MATLAB抑制函数中disp()实例的命令行put,matlab,Matlab,在一个函数中,我有几个disp()实例来帮助跟踪长时间计算过程的进度 比如说, function myfun(inputs) ... disp('Step i finished') ... end 在myfun的其他一些用法中,没有disp()消息更方便。有没有一种方法可以在不添加新代码或不使用eval()函数的情况下抑制命令行中的消息“Step i finished”(步骤i已完成) 注意:eval()对于任何严肃的计算来说都太慢了 在MATLAB中没有重定向“std

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

比如说,

function myfun(inputs)
    ...
    disp('Step i finished')
    ...
end
myfun
的其他一些用法中,没有
disp()
消息更方便。有没有一种方法可以在不添加新代码或不使用
eval()
函数的情况下抑制命令行中的消息“Step i finished”(步骤i已完成)


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

在MATLAB中没有重定向“
stdout
”的机制。您可以使用
evalc
捕获它,然后忽略它,但这也会捕获(从而抑制)所有警告。此外,使用
eval
的所有常见反对意见都适用

如果你坚持,那么你可以使用这个坏黑客:

disp = @(~) display([]);  %# at the start of the function
或者,如果您真的不想更改函数中的单个字母,请将

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

但实际上,最好的方法是重写函数,以便显示是可选的,和/或显示级别可调。例如,与几乎所有MATLAB自身的函数类似:

options = optimset('Display', 'iter-detailed');
[~] = fminsearch(@cos, 3, options);


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

MATLAB中没有重定向“
stdout
”的机制。您可以使用
evalc
捕获它,然后忽略它,但这也会捕获(从而抑制)所有警告。此外,使用
eval
的所有常见反对意见都适用

如果你坚持,那么你可以使用这个坏黑客:

disp = @(~) display([]);  %# at the start of the function
或者,如果您真的不想更改函数中的单个字母,请将

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

但实际上,最好的方法是重写函数,以便显示是可选的,和/或显示级别可调。例如,与几乎所有MATLAB自身的函数类似:

options = optimset('Display', 'iter-detailed');
[~] = fminsearch(@cos, 3, options);


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

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

function vfprintf(verbose, varargin)

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

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

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

function vfprintf(verbose, varargin)

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

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

我认为
evalc()
是唯一的方法。据我所知,
eval()
evalc()
应该不会对性能产生任何影响。您到底是如何测试这些代码来得出这个结论的?@RodyOldenhuis在evalevalc中的代码不会被JIT加速(因为被评估的代码在运行时可能会更改为任何内容),因此它会对性能产生很大影响。@SamRoberts:您有相关文档的链接吗?我怀疑这是一种说法,但我的(承认很简单)测试表明并非如此…@RodyOldenhuis type
doc eval
,然后单击底部的“eval函数的替代方案”。在“为什么要避免eval函数”一节中。请注意,如果从函数中调用
eval
,则会发生这种情况;我不确定如果从命令行调用
eval
会发生什么。我认为
evalc()
是唯一的方法。据我所知,
eval()
evalc()
应该不会对性能产生任何影响。您到底是如何测试这些代码来得出这个结论的?@RodyOldenhuis在evalevalc中的代码不会被JIT加速(因为被评估的代码在运行时可能会更改为任何内容),因此它会对性能产生很大影响。@SamRoberts:您有相关文档的链接吗?我怀疑这是一种说法,但我的(承认很简单)测试表明并非如此…@RodyOldenhuis type
doc eval
,然后单击底部的“eval函数的替代方案”。在“为什么要避免eval函数”一节中。请注意,如果从函数中调用
eval
,则会发生这种情况;如果您从命令行调用
eval
,我不确定会发生什么。“但实际上,最好的方法是重写您的函数,使其显示为可选”-此行应显示为粗体。:)“但实际上,最好的方法是重写函数,使其显示为可选”-此行应以粗体显示。:)