
Nástrahy při programování v MATLABu
Výše naznačený postup - totiž práce s vektory a s maticemi nikoliv v cyklech, ale se všemi prvky v jediném příkazu najednou - je pro MATLAB typický. V tom také spočívá jedna z velkých předností tohoto systému - možnost psát programy velmi efektivně. Skrývá se zde ale také kámen úrazu, dokonce i pro zkušené programátory, kteří mohou být navyklí na jiný způsob práce.
Uveďme jednoduchý příklad. Potřebujeme definovat nějakou funkci po částech, dejme tomu f(x) bude mít hodnotu x^2 pro x < 0 a hodnotu x^3 pro x >= 0. První věc, která by mnohé napadla, je udělat to následovně:
|
Tento postup je zajisté správný, pokud by se jednalo o program řekněme v jazyce C nebo Pascal, kde při počítání funkčních hodnot pro nějakou množinu bodů postupujeme v cyklu. Ale v MATLABu je zvykem, že jako argument funkce může být použit vektor nebo matice, funkce pak vrátí vektor či matici stejného řádu, kde na odpovídajících místech budou funkční hodnoty v původních bodech. Tohle výše uvedená funkce evidentně nedělá.
Vypadá to, že stačí, když opravíme operátor ^ na operátor .^, který pracuje po složkách. Tato úprava ale nestačí. Jak bylo vysvětleno výše, výraz za klíčovým slovem if je matice nul a jedniček stejného řádu jako proměnná x. Stačí, aby nula byla jediná, a provede se druhá větev programu. Tedy jestliže jediná složka matice x bude nezáporná, pak výsledkem budou na všech místech výstupu třetí mocniny. Pokud ale budou všechny složky záporné, výsledek bude kupodivu správný.
Pokusme se funkci opravit. Jeden ze způsobů, jak to udělat, je provést přiřazování v cyklech. Výsledek pak vypadá takto:
function y = f1(x) |
Tento postup je po stránce výsledků správný, ztrácí se jím ale veškeré výhody MATLABu. Problém lze vyřešit mnohem efektivněji. Jednak by bylo možné použít pouze jeden cyklus ve tvaru for k = 1:m*n a při indexování pak zadávat pouze jeden index, např. y(k) = x(k)^2;
Lze se ale obejít bez cyklů úplně. Stačí, jestliže vytvoříme dvě matice stejného řádu jako x, první bude mít jedničky na místech záporných složek x a nuly jinde, u druhé tomu bude naopak. Tyto matice vynásobíme druhými resp. třetími mocninami složek x a po sečtení vyjde správný výsledek. Pro lepší pochopení uvedeného postupu uvedeme následující program:
|
Je dokonce možné provést zkrácení na jediný řádek, pokud nepočítáme hlavičku funkce:
|
Tato verze je nejen daleko kratší, ale rovněž funguje rychleji, protože provádění cyklů je v MATLABu poměrně pomalé, kdežto pro manipulaci s maticemi se používají interní MATLABovské funkce, které pracují daleko efektivněji.