Есть ли способ автоматически подавить 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
,