【问题标题】:MATLAB suppress command line put of disp() instances in a functionMATLAB 在函数中抑制 disp() 实例的命令行放置
【发布时间】:2014-08-24 03:41:46
【问题描述】:

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

例如,

function myfun(inputs)
    ...
    disp('Step i finished')
    ...
end

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

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

【问题讨论】:

  • 我认为evalc()是唯一的办法。
  • 据我所知,eval()evalc() 对性能的影响应该为零。您究竟是如何测试这些得出这个结论的?
  • @RodyOldenhuis evalevalc 中的代码不会被 JIT 加速(因为评估的代码可能会在运行时更改为任何内容),因此它会对性能产生很大影响。
  • @SamRoberts:你有相关文档的链接吗?我怀疑这将是索赔,但我的(诚然简单的)测试表明并非如此......
  • @RodyOldenhuis 输入doc eval,然后点击底部的“替代评估函数”。它在“为什么要避免使用 eval 函数”部分。请注意,如果从函数中调用eval,就会发生这种情况;我不确定如果您从命令行调用 eval 会发生什么。

标签: matlab


【解决方案1】:

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

如果你坚持,那么你可以使用这个糟糕的bad BAD hack:

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)

【讨论】:

  • “但实际上,最好的方法是重写你的函数,以便显示是可选的” - 这行应该显示为粗体。 :)
【解决方案2】:

实现像这样打开/关闭诊断消息功能的一种非常简单的方法是使用实​​用函数vfprintf

function vfprintf(verbose, varargin)

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

然后您可以将verbose 设置为true 或false,否则就像fprintf 一样使用该功能。您也可以执行非常类似的操作来创建 vdisp 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多