Dnes se podíváme na praktické příkazy a úpravy Matlabu, které jistě velmi oceníte při ladění skriptů.
Povolte code folding u cell (oblasti, které začínají dvojitým "%") - Preferences -> Editor/Debugger -> Code Folding.
Reference: MATLAB Central - MATLAB Spoken Here » Fold whatever you want using cells.
dbstop - zastaví program na daném místě. Praktický je tento kód (funguje namísto try...catch):
dbstop if error
Pokud máte více funkcí nebo rozsáhlejší skript, který nefunguje tak jak má, je dobré zkontrolovat všechny jeho části - zda obsahují hodnoty, které mají.
První kontrolou je Workspace (okno Matlabu), ve kterém vidíte hodnoty proměnných, jejich velikost a můžete si přidat i další sloupce, jako třeba minimální a maximální hodnotu, průměr a pod. Problém je, že pokud máte své skripty rozdělené do funkcí, to co ve Workspace uvidíte budou pouze globální proměnné, pokud nezadáte Breakpointy uvnitř funkce, její proměnné neuvidíte.
Velmi praktická věc, standardně na klávesu F9 - vykoná označenou část kódu. Funguje jak v Debug modu, tak i když skript neběží.
Ve spojení s Zkratkou kódu používám při ladění tento skriptík:
% vezmeme aktualni otevreny dokument editor = matlab.desktop.editor.getActive; % vezmeme vybrany text selected = editor.SelectedText; % spustime vybrany kus kodu eval(selected); % pro vypisy dalsich hodnoty tmp_selected_value_name = genvarname(selected); eval(['tmp_selected_variable=' tmp_selected_value_name]); % -------------------------- % Prostor pro vypisy % -------------------------- selected_sum = sum(tmp_selected_variable) selected_sqrt = sqrt(tmp_selected_variable) % -------------------------- % uklidime clear editor, clear selected, clear tmp_selected_variable, clear tmp_value_name;
Aneb přejmenování proměnné. V Matlabu 2013 stačí najet kurzorem na konec názvu proměnné, kterou chceme přejmenovat a začít psát - objeví se bublina, zda chceme proměnnou přejmenovat všude - stačí stisknout Shift+Enter.
Matlab umožňuje vytvořit i zkratky kódu. Viz článek Matlab: klávesové zkratky pro často se opakující příkazy přímo v toolbaru.
Dále doporučuji k pozornosti článek <a data-cke-saved-href="http://blog/">blog/">blog/">blog.mathworks.com/desktop/2011/05/09/r2011a-matlab-editor-api/" title="R2011a MATLAB Editor API" >R2011a MATLAB Editor API, který ukazuje možnosti automatizace práce s Editorem.
Debug mode slouží k ladění skriptů. Standardně se spouští klávesou F5. Do okamžiku, než definujete Breakpoint (bod, kde se má skript během vykonávání zastavit) se tváří jako obyčejný Run.
Pokud se nacházíte v Debug mode, je v Command Windows namísto >> značka K>>.
Pokud potřebujete během vykonávání skriptu kontrolovat některé proměnné (jakože to vřele doporučuji;) ), klikněte na sloupeček s čísly řádku - vytvoří se červené kolečko, Breakpoint, před kterým se během vykonávání skript zastaví a vy se tak můžete i uvnitř funkcí podívat, jaké tam jsou hodnoty, ať už ve workspace nebo evaluací části kódu.
Pokud na číslu řádku kliknete pravým myšítkem, můžete přidat tzv. Conditional breakpoint - místo, kde se program zastaví jen při splnění dané podmínky.
Pozor! Příkaz:
clear all
, který jak jsem zjistil dost lidí rádo používá k mazání Workspace, proměnných a figur, vymaže i breakpointy! Pokud jej tedy máte na začátku skriptu kvůli pořádku, můžete breakpointy nastavovat jako diví a Matlab si jich ani nevšimne. Pro mazání proměnných doporučuji používat místo toho příkaz:
clear variable
dbclear all
Pokud nefunguje Ctrl+C, můžete buď použít tlačítko (v Matlabu 2013) nebo příkaz:
dbquit
Dá se nastavit i klávesová zkratka (viz níže).
V menu File / Preferences... / Keyboard / Shortcuts najdete klávesové zkratky. Osobně jsem si nastavil na klávesu F4 akci "Exit Debug Mode"
Další praktickou zkratkou je standardní Ctrl + C, které ukončuje provádění skriptu (hodí se zejména při zacyklení - musíte mít ale kurzor v Command Window).
Velmi šikovnou zkratkou je Ctrl + i, nazvaná je jako Smart Indent a jedná se o zformátování označené části kódu, což je VELMI praktické a dlouhou dobu jsem žil v myslém domnění, že Matlab nic takového neumí, takže jsem mezerníkoval a tabelátoroval jako divý;-)
Pozor! Jen mimo blok Try/Catch:
if (verbose) dbstop if warning; else dbclear if warning; end
tento kód způsobí, že když je proměnná "verbose" True, zastaví se program na tomto místě, pokud dojde k warningu (analogicky - "error"). Pokud je False, tento mód se deaktivuje. Jde také vyvolat z menu:
dbstop if caught error
if (verbose) rethrow(e); end
assert(PODMINKA)
Já používám takovéto schema:
verbose = 1; % promenna, kterou nastavim, zda chci zastavovat nebo ne try % muj kod catch e if (verbose) % zastavim si na erroru dbstop if error % vyvolam si komplet error rethrow(e); else % vyvolam si svou error hlasku warning('Improper LABORATORY data.'); end end
Tento web jsem zakládal na střední, v roce 2008. Je zde hlavně archiv mé tvorby.
Aktuální věci publikuji kvůli úspoře času na Twitter.
Honza
"To, co druzí dělají, může být podnětem našich pocitů, nikoli však jejich příčinou."