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()对于任何严肃的计算来说都太慢了。
-
我认为evalc()是唯一的方法。
-
据我所知,eval()和evalc()应该对性能的影响为零。您究竟是如何测试得出该结论的?
-
JIT不会加速eval或evalc中的@RodyOldenhuis代码(因为所评估的代码可以在运行时更改为任何代码),因此它会极大地影响性能。
-
@SamRoberts:您是否有相关文档的链接?我怀疑这将是索赔,但是我的(非常简单的)测试表明不是...
-
@RodyOldenhuis键入doc eval,然后单击底部的"替代评估函数"。在"为什么要避免评估功能"部分中。请注意,如果在函数中调用eval,则会发生这种情况。我不确定如果从命令行调用eval会发生什么情况。
-
@RodyOldenhuis当然,无论是否发生这种情况,并且不管任何性能考虑因素,避免使用eval的主要原因都是为了使代码易于维护和调试。
-
@SamRoberts:...更安全:)是的,我知道eval是evil的拼写错误。但是,OP的主张是如此僵化和僵化,没有任何上下文和佐证,我只想说一句:)此外,如果他/她知道那样的确定性,那为什么他/他不知道如何做文字正确显示?
-
@SamRoberts:出于好奇:" MATLAB首次运行时会编译代码,以增强以后的运行性能。但是,由于eval语句中的代码可以在运行时更改,因此无法编译"。 OP表示感兴趣的功能将在同一会话中在eval内部和外部运行。在性能上有意义吗?
-
@RodyOldenhuis也许会-但Id只是在猜测。我不知道。
-
大家好,Matlab的官方文档建议用户不要使用eval()。该页面应作为第一批搜索结果之一出现。我在使用eval()和使用直接循环离散化函数之间没有明显的性能差异。如果你们中的任何一个对eval()的性能绝对感兴趣,也许打开了一个不同的问题线程,那么我会给出一些测试结果。
-
至于JIT,我很难看清JIT如何与eval()一起工作,因为封装的代码在每次运行时都会发生变化。但是也许将一个函数传递给eval并不是很糟糕。
在MATLAB中,没有机制可以重定向" stdout"。您可以使用evalc捕获它,然后将其忽略,但这也可以捕获(并因此取消)所有警告。同样,所有使用eval的常见反对意见均适用。
如果您坚持认为,则可以使用此不良BAD hack:
1
| disp = @ (~ ) display ([]); %# at the start of the function |
或者,如果您确实不想更改函数中的单个字母,请输入
在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:
然后,您可以将verbose设置为true或false,否则可以像fprintf一样使用该函数。您也可以做类似的事情来创建vdisp函数。