Cílem semináře
Cílem semináře je seznámit se s dvěmi základními technikami optimalizace v Matlabu: prealokací a vektorizací.
Prealokace
Matlab při zápisu hodnoty do neexistujícího prvku matice (popřípadě pole) tuto matici zvětší na potřebný rozměr. Při takovém rozšíření může být potřeba alokovat v paměti nový souvislý blok paměti a přesunout matici na toto nové místo. To může být časově náročné.
Tento problém lze řešit prealokací: tedy alokováním potřebné paměti dopředu.
Příklad: následující kód uloží na diagonálu matice A hodnoty 1 až 5000.
Při každém zápisu tedy rozšíři matici z velikosti ixi na matici velikosti (i+1)x(i+1).
Pomocí tic a toc změříme čas výpočtu tohoto kódu.
v = 3000;ticA = 0;for i = 1:v A(i,i) = i;endtocNa mém počítači trval výpočet 7.868510 vteřin. Porovnejme nyní rychlost výpočtu s použitím techniky prealokace:
ticB = zeros(v, v);for i = 1:v B(i,i) = i;endtoc
Na mém počítači tento výpočet trval 0.028896 vteřin.
Pokud máte výkonější počítač a oba výpočty proběhly příliš rychle, můžete opakovat pokus s větší velikosí matice změnou hodnoty v.
Vektorizace cyklů
Matlab je optimalizován pro operace s maticemi a vektory. Technika vektorizace cyklů spočívá v přepsání cyklů na ekvivalentní maticové operace. Vektorizace cyklů je vhodná jednak z hlediska rychlosti výpočtu, tak z hlediska estetiky: nahrazení cyklů maticovými operacimi zvýší čitelnost kódu.
Cyklus v předchozím příkladu můžeme vektorizovat pomocí funkce diag:
D = diag(v)Dalším příkladem může být násobení matic či vektorů.
Vynásobení dvou matic lze realizovat pomocí tří cyklů.
Nicméně v Matlabu pro tento účel máme k dispozici operaci *, která přímo maticové násobení provádí.
I když tento příklad může znít jaksi samozřejmě, nezřídka se stává, že si uživatel v programátorskému zápalu tento fakt neuvědomí a programuje i běžné a v Matlabu již implementované maticové operace.
Více informací k vektorizace naleznete v dokumentaci zde. V tabulce Functions Commonly Used in Vectorization pak naleznete často používané funkce při vektorizaci.