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;
tic
A = 0;
for i = 1:v
A(i,i) = i;
end
toc
Na 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:
tic
B = zeros(v, v);
for i = 1:v
B(i,i) = i;
end
toc
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.