如何在Matlab或Octave中刷新disp输出?

40

我在Octave中编写了一个程序,其中有一个循环 - 运行具有不同参数的函数,这不是我可以转换为矩阵的内容。在每次迭代开始时,我使用disp打印当前参数。

前几次运行时,我看到了brazillion警告,然后我也看到了这些输出。现在我已经清理干净了它们,我再也看不到它们了。我猜想它们被卡在缓冲区中,当程序结束或缓冲区填满时,我会看到它们。

是否有任何方法强制刷新打印缓冲区,以便我可以看到我的打印内容?


这里还有更多信息,包括分页的内容:http://www.chemie.fu-berlin.de/chemnet/use/info/octave/octave_22.html - Nucular
在Matlab中也会发生这种情况吗? - Andrey Rubshtein
7个回答

46

使用 fflush(stdout) 和/或 fflush(stderr) 来刷新从 disp() 函数的缓冲区。


10
你知道Matlab是否有类似于fflush()的函数吗?我想做相同的事情,但我使用的是Matlab而不是Octave,且没有fflush()函数。 - Andrew Janke
7
在MATLAB中,使用drawnow('update') 来刷新输出。 - Arthur Hebert-Ryan

30

如moastab所述,在Octave中可以使用fflush(stdout)

在MATLAB中,使用drawnow('update')来刷新输出。

MATLAB的drawnow函数对于控制MATLAB中图形对象的重绘是熟悉的,但它也适用于stdout stderr缓冲区。 'update'选项不是必需的,但限制了刷新到非图形队列。这一细节仅隐含在drawnow()文档中; 我已经验证它可在循环中的fprintf调用上工作。


21

Octave:您可以通过调用 more off 来关闭输出缓冲区。

这将禁用分页功能,使所有输出直接发送到屏幕。


7

将以下命令放在您的部分或代码开头:

page_screen_output(0);

page_output_immediately(1);

3
如果我理解您的问题正确,您可以使用“日记”功能将所有会话输出转储到文本文件中。 diary on 将开始记录,diary off 将停止记录。 diary filename 将使用文件名而不是默认值 "diary"。
这是 Octave 和 MATLAB 中内置的函数。有关更多详细信息,请参见 help diary
此外,您还可以增加 Octave 缓冲区大小。在 Windows 上,您可以从左上角菜单中的 Octave 属性对话框中执行此操作。

2

这里和其他地方,至少有5种方法可以在Octave中获得即时输出。

使用以下其中一种

%---------------------------
% Turn OFF output buffering
%---------------------------
more off                        % command & NOT shown in output
PAGER = "less"                  % built-in var - shown in output
page_screen_output = 0          % built-in var - shown in output
page_output_immediately = 1     % built-in var - shown in output
fflush(stdout)                  % Need to call after each "output" line

0

drawnow会导致图形更新,我不确定它是否也适用于stdout管道。

你可能还需要将disp(...)语句转换为fprintf(stderr, ...),因为我认为在Octave上stderrstdout的处理方式是不同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接