Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyVýpočetní matematické systémy Jak pracovat s MATLABem Programování v MATLABu Nástrahy při programování v MATLABu

Logo Matematická biologie

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)
       [m,n] = size(x);      %zjištění rozměrů matice
       y = zeros(size(x)) %definice výstupní matice stejných rozměrů
       for k = 1:m
         for l = 1:n
             if x(k,l) < 0
               y(k,l) = x(k,l)^2;
             else
               y(k,l) = x(k,l)^3;
             end
         end
       end
end

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.

 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity