Есть ли способ автоматически подавить Matlab от печати больших матриц в окне команд?

Есть ли опция в matlab или плагин/приложение или трюк, так что если вы находитесь в интерактивном командном сеансе, каждый раз, когда он будет распечатывать матрицу, слишком большую для человека, чтобы просмотреть ее, она преобразует результат либо предупреждение о том, насколько велика матрица, либо сводка (всего несколько строк и столбцов) матрицы?

Есть много раз, когда я хочу изучить матрицу в окне команд, но я не понимал, насколько она велика, поэтому я случайно распечатал все это. Или какое-то место внутри функции, которую я сам не кодировал, кто-то пропустил точку с запятой, и я передал ей большую матрицу, и она сбрасывает все это в моем командном окне.

Имеет смысл, что в 99,99% случаев люди не намерены печатать миллионную матрицу строк в своем интерактивном окне команд, верно? Он полностью спамает свой буфер прокрутки и удаляет всю полезную информацию, которая была у вас на экране раньше.

Таким образом, для Matlab гораздо больше смысла автоматически предполагать, что пользователь в интерактивных сеансах хочет вывести резюме большой матрицы, вместо того, чтобы сбрасывать все это в командное окно. В настройках должна быть такая опция.

Ответ 1

Одна из возможностей состоит в том, чтобы перегрузить функцию display, которая вызывается автоматически, когда вы вводите выражение, которое не завершено ;. Например, если вы помещаете следующую функцию в папку с именем "@double" в любом месте вашего пути MATLAB, поведение по умолчанию display будет переопределено для массивов double (это основано на Mohsen Nosratinia 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 

EDIT. Обновлено для соответствия предпочтениям формата вывода 'compact' и 'loose'.

РЕДАКТИРОВАТЬ 2. Предотвратите disp закладывание пустого массива. Это делает whos, а другие команды избегают ненужного display.