Optimalizace v Matlabu

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 15000. 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.