有没有办法自动抑制Matlab在命令窗口中打印大矩阵?

时间:2013-11-06 18:10:38

标签: matlab interactive interactive-session

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

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

有意义的是,在99.99%的时间里,人们不打算在交互式命令窗口中打印一百万行矩阵,对吧?它完全阻止了它们的滚动缓冲区并删除了之前在屏幕上显示的所有有用信息。

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

1 个答案:

答案 0 :(得分:21)

一种可能性是重载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