Como limpar variáveis persistentes enquanto mantém pontos de interrupção no MATLAB?
-
22-09-2019 - |
Pergunta
Existe uma maneira de limpar todas as variáveis persistentes nas funções MATLAB, mantendo os pontos de interrupção nos arquivos de função correspondentes?
clear all;
e
clear functions;
ambos matam os pontos de interrupção.
Solução
Infelizmente, limpar variáveis persistentes também limpa pontos de interrupção, mas há uma solução alternativa.
Depois de definir os pontos de interrupção que deseja manter, use o comando dbstatus
função para obter uma estrutura contendo esses pontos de interrupção e, em seguida, salvar essa estrutura em um arquivo MAT.Depois de limpar as variáveis, você poderá recarregá-las carregando o arquivo MAT e usando dbstop.A seguir está um exemplo de execução desta sequência de operações:
s=dbstatus;
save('myBreakpoints.mat', 's');
clear all
load('myBreakpoints.mat');
dbstop(s);
Outras dicas
Com base nas soluções da RTBernard e do Jonas, criei um script que evita a necessidade de salvar e carregar de um arquivo.Observe, entretanto, que isso não limpa as classes como a solução de Jonas.Também fecho todos os números, pois é isso que normalmente quero fazer ao limpar tudo.Aqui está:
% Close all figures including those with hidden handles
close all hidden;
% Store all the currently set breakpoints in a variable
temporaryBreakpointData=dbstatus('-completenames');
% Clear functions and their persistent variables (also clears breakpoints
% set in functions)
clear functions;
% Restore the previously set breakpoints
dbstop(temporaryBreakpointData);
% Clear global variables
clear global;
% Clear variables (including the temporary one used to store breakpoints)
clear variables;
Este script e alguns outros utilitários Matlab estão no Github aqui.
Se houver dados em @directories, você ainda poderá usar o método que RTBarnard propõe
s=dbstatus('-completenames');
save('myBreakpoints.mat','s');
%# if you're clearing, you may as well just clear everything
%# note that if there is stuff stored inside figures (e.g. as callbacks), not all of
%# it may be removed, so you may have to 'close all' as well
clear classes
load('myBreakpoints.mat')
dbstop(s);
%# do some cleanup
clear s
delete('myBreakpoints.mat')
s=dbstatus; % keep breakpoints
evalin('base','clear classes')
dbstop(s);
Para ser copiado em um arquivo de função (exemplo myclearclasses) dessa maneira, não há necessidade de arquivo .mat temporário.
É simples, você deve usar * como regexp para encontrar todas as variáveis.Isso limpará todo o espaço de trabalho e existirão pontos de interrupção.
clear *;
Eu descobri uma solução rápida para isso usando preferências e as respostas dos outros:
setpref('user', 'breakpointBackup', dbstatus('-completenames'));
clear all;
clear import;
clear java;
dbstop(getpref('user', 'breakpointBackup'));
A vantagem desta abordagem é que ela é muito limpa (ou seja,nenhum arquivo temporário) e limpa tudo.