【问题标题】:Is there a way to automatically suppress Matlab from printing big matrices in command window?有没有办法自动抑制 Matlab 在命令窗口中打印大矩阵?
【发布时间】:2013-11-18 03:08:02
【问题描述】:

在 matlab 或插件/应用程序中是否有一个选项或一个技巧,如果您处于交互式命令会话中,每次它会打印出一个太大而无法让人查看的矩阵时,它会编辑输出是警告矩阵有多大还是矩阵的摘要(只有几行和几列)?

有很多次我想在命令窗口中检查一个矩阵,但我没有意识到它有多大,所以我不小心把整个东西打印出来了。或者我自己没有编码的函数内部的某个地方,有人遗漏了一个分号,我递给它一个大矩阵,它把整个东西转储到我的命令窗口中。

在 99.99% 的时间里,人们并不打算在他们的交互式命令窗口中打印一百万行矩阵,这是有道理的,对吧?它完全向他们的滚动缓冲区发送垃圾邮件,并删除您之前在屏幕上看到的所有有用信息。

因此,matlab 自动假设交互会话中的用户想要输出一个大矩阵的摘要,而不是将整个事情转储到命令窗口中,这更有意义。设置里至少应该有这样一个选项。

【问题讨论】:

标签: matlab interactive interactive-session


【解决方案1】:

一种可能性是重载display 函数,当您输入未被; 终止的表达式时,该函数会自动调用。例如,如果您将以下函数放在 MATLAB 路径中名为“@double”的文件夹中,则默认的display 行为将被double 数组覆盖(这是基于Mohsen Nosratinia's display.m 用于显示矩阵维度) :

% @double/display.m
function display(v)
% DISPLAY Display a variable, limiting the number of elements shown.

name = inputname(1);    
if isempty(name)
    name = 'ans';
end

maxElementsShown = 500;
newlines = repmat('\n',1,~strcmp(get(0,'FormatSpacing'),'compact'));

if numel(v)>maxElementsShown,
    warning('display:varTooLong','Data not displayed because of length.');
    % OR show the first N=maxElementsShown elements
    % builtin('disp', v(1:maxElementsShown));
elseif numel(v)>0,
    fprintf([newlines '%s = \n' newlines], name);
    builtin('disp', v);
end

end

例如,

>> xx=1:10

xx = 

     1     2     3     4     5     6     7     8     9    10  

>> xx=1:1e4
Warning: Data not displayed because of length. 
> In double.display at 17 

编辑:更新为尊重'compact''loose' 输出格式偏好。

编辑 2:防止disp放置一个空数组。这使得whos 和其他命令避免了不必要的display

【讨论】:

  • 非常好,但如果您只显示第一个元素,我建议您在数字下方也发出警告。
  • 感谢这个脚本!一个额外的问题:有没有办法检测命令是在交互模式还是批处理模式下运行?这样在批处理模式下, disp 函数将是默认值,并且只有在交互模式下才会被用户自定义函数重载?
  • 检测命令是从函数(不仅仅是脚本)还是命令提示符(或基本脚本)运行的一种方法是检查堆栈的大小。例如,if numel(dbstack)>0, fprintf('You are in a function.\n'); else, fprintf('You are in the base workspace.\n'); end。所以,如果你在一个函数中,你可以设置disp = @(x) builtin('disp',x);,这样函数就可以使用内置的disp。对于display,使用if numel(dbstack)>0, evalin('caller',['builtin(''display'',' name ');']); ... 修改display.m,以便它检测到一个函数正在调用它并恢复为内置函数。
  • 我正在使用它,但我也想指出它不会重现空矩阵的默认行为。
  • @moarningsun 我记得空矩阵有一些奇怪的行为(没有numel(v)>0 检查)。我不记得是什么了。也许可以将else fprintf([newlines '%s = \n' newlines ' []\n'], name); 添加到if 语句以获得默认行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多