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

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

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

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

So it makes much more sense for matlab to automatically assume that the user in interactive sessions want to output a summary of a big matrix, instead of dumping the whole thing into the command window. There should at least be such an option in the settings.

1 ответ

Решение

Одной из возможностей является перегрузка display функция, которая вызывается автоматически при вводе выражения, которое не заканчивается ;, Например, если вы поместите следующую функцию в папку с именем "@double" в любом месте вашего пути MATLAB, по умолчанию display поведение будет отменено для double массивы (это основано на display.m Mohsen Nosratinia для отображения размеров матрицы):

% @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,

Другие вопросы по тегам